Android中子线程更新主线程UI和ProgressBar的应用
2013-10-31 17:13
211 查看
很多情况先都需要开启其他子线程,但子线程又不能直接更新主线的UI,利用handler可以实现这个需求
调用的方法是
View.VISIBLE
View.INVISIBLE
View.GONE//如果使用这个,其他控件的位置和这个控件不要有联系,否则布局会会乱
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.VISIBLE
View.INVISIBLE
View.GONE//如果使用这个,其他控件的位置和这个控件不要有联系,否则布局会会乱
相关文章推荐
- android 子线程中更新界面?被ProgressBar给迷惑了
- Android中子线程真的不能更新UI吗?
- android中子线程更新UI的方式浅析
- 《第一行代码》第二版 学习总结28 Android中子线程更新UI的三种方式
- Android中子线程真的不能更新UI吗?
- Android在联网应用开发中的线程管理与界面更新
- Android中子线程真的不能更新UI吗?
- Android中子线程中更新UI的N中方法
- android中子线程更新UI的方式浅析
- Android在联网应用开发中的线程管理与界面更新
- android ProgressBar ProgressDialog可以在子线程中更新的原理
- Android中子线程真的不能更新UI吗?
- [置顶] Android中子线程真的不能更新UI吗?
- Android中子线程真的不能更新UI吗?
- android中子线程更新UI的几种方法
- Android中子线程真的不能更新UI吗?
- Android新线程中更新主线程UI中的View方法汇总
- android中子线程更新UI的方式浅析
- android 橘子汁 在子线程中更新主线程UI 困扰
- Android中子线程真的不能更新UI吗?