Android中子執行緒更新主執行緒UI和ProgressBar的應用
很多情況先都需要開啟其他子執行緒,但子執行緒又不能直接更新主線的UI,利用handler可以實現這個需求
1、定義一個標識DOWN_FINISH和new 一個handler並重寫handleMessage方法
2、在子執行緒中Message message=Message.obtain();這樣比直接new一個Message效率更高,應為進度條是一直重新整理,會一直new,而obtain()方式的的解釋是A Message object from the global pool.
直接看程式碼:
public class MainActivity extends Activity implements OnClickListener {
private Button download;
private Button pbBtn;
private EditText et;
private ProgressBar pb;
private static final int DOWN_FINISH = 3;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWN_FINISH:
pb.setVisibility(View.INVISIBLE);
Toast.makeText(MainActivity.this, "下載完成", Toast.LENGTH_SHORT)
.show();
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pbBtn = (Button) findViewById(R.id.button2);
pb = (ProgressBar) findViewById(R.id.progressBar1);
pb.setVisibility(View.INVISIBLE);
pbBtn.setOnClickListener(this);
}
public void tryLoad() {
new Thread(new Runnable() {
@Override
public void run() {
String url = et.getText().toString().trim();
String newFileName = url.substring(url.lastIndexOf("/") + 1,
url.length());
if (!TextUtils.isEmpty(url)) {
DownloadUtils.download(url, newFileName, "/sdcard/", 10);
}
}
}).start();
}
public void progressBar() {
pb.setVisibility(View.VISIBLE);
final int max = 20;
pb.setMax(max);
new Thread(new Runnable() {
int current = 0;
boolean flag = true;
@Override
public void run() {
while (flag) {
current++;
pb.setProgress(current);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (current >= max) {
flag = false;
Message msg = Message.obtain(handler);
msg.what = DOWN_FINISH;
// 這裡是sendMessage方法,而不是自己重寫的handleMessage方法
handler.sendMessage(msg);
}
}
}
}).start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v == pbBtn) {
progressBar();
}
}
}
效果:
紅色區域是 進度條,因為我這初始化時讓其不可見,點選 PBTest 顯示進度條及進度動畫,進度達到最大值時讓其不可見
呼叫的方法是
pb.setVisibility(View.INVISIBLE);
View.VISIBLEView.INVISIBLE
View.GONE//如果使用這個,其他控制元件的位置和這個控制元件不要有聯絡,否則佈局會會亂

相關文章
- java中如何給多執行緒中子執行緒傳遞引數?Java執行緒
- ObjC 多執行緒簡析(一)-多執行緒簡述和執行緒鎖的基本應用OBJ執行緒
- 執行緒和執行緒池執行緒
- Android多執行緒之執行緒池Android執行緒
- android程式和執行緒Android執行緒
- Android程式框架:執行緒與執行緒池Android框架執行緒
- 子執行緒與UI執行緒的通訊(委託)執行緒UI
- 多執行緒應用執行緒
- 多執行緒和多執行緒同步執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 走進Java Android 的執行緒世界(二)執行緒池JavaAndroid執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- Android執行緒池Android執行緒
- 瞭解 Android 的程式和執行緒Android執行緒
- 多執行緒--執行緒管理執行緒
- 執行緒與多執行緒執行緒
- 執行緒 執行緒池 Task執行緒
- 多執行緒【執行緒池】執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- 詳談執行緒池的理解和應用執行緒
- Android中的執行緒池Android執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Java中命名執行器服務執行緒和執行緒池Java執行緒
- PyQt應用程式中的多執行緒:使用Qt還是Python執行緒?QT執行緒Python
- 保證執行緒在主執行緒執行執行緒
- Android 子執行緒 UI 操作真的不可以?Android執行緒UI
- 執行緒、多執行緒和執行緒池,看完這些你就能全部搞懂了執行緒
- 敲開阿里大門的執行緒、多執行緒和執行緒池面試專題阿里執行緒面試
- 執行緒池中的最大執行緒數、核心執行緒數和佇列大小的合理設定執行緒佇列
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒之初識執行緒執行緒
- 執行緒控制之休眠執行緒執行緒
- 多執行緒,執行緒類三種方式,執行緒排程,執行緒同步,死鎖,執行緒間的通訊,阻塞佇列,wait和sleep區別?執行緒佇列AI
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 瀏覽器多執行緒和js單執行緒瀏覽器執行緒JS
- 多執行緒:執行緒池理解和使用總結執行緒
- 《Java 高階篇》七:執行緒和執行緒池Java執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 執行緒池建立執行緒的過程執行緒