Android中子线程更新主线程UI和ProgressBar的应用
来源:互联网 发布:淘宝保证金不见了找谁 编辑:程序博客网 时间:2024/06/05 08:31
很多情况先都需要开启其他子线程,但子线程又不能直接更新主线的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() {@Overridepublic 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;}};};@Overrideprotected 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() {@Overridepublic 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;@Overridepublic void run() {while (flag) {current++;pb.setProgress(current);try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (current >= max) {flag = false;Message msg = Message.obtain(handler);msg.what = DOWN_FINISH;// 这里是sendMessage方法,而不是自己重写的handleMessage方法handler.sendMessage(msg);}}}}).start();}@Overridepublic 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;}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (v == pbBtn) {progressBar();}}}
效果:
红色区域是 进度条,因为我这初始化时让其不可见,点击 PBTest 显示进度条及进度动画,进度达到最大值时让其不可见
调用的方法是
pb.setVisibility(View.INVISIBLE);View.VISIBLE
View.INVISIBLE
View.GONE//如果使用这个,其他控件的位置和这个控件不要有联系,否则布局会会乱
- Android中子线程更新主线程UI和ProgressBar的应用
- android中子线程和主线程通信
- android线程间通信和主线程更新ui
- 【Android】几种子线程更新UI主线程的方法
- android中子线程更新UI的方式浅析
- android中子线程更新UI的方式浅析
- Android中子线程中更新UI的N中方法
- android中子线程更新UI的方式浅析
- android中子线程更新UI的方式浅析
- android中子线程更新UI的几种方法
- Android中子线程真的不能更新UI吗?
- Android中子线程真的不能更新UI吗?
- Android中子线程真的不能更新UI吗?
- Android中子线程真的不能更新UI吗?
- Android中子线程真的不能更新UI吗?
- android中子线程可以更新UI,是真的吗?
- Android中子线程真的不能更新UI吗?
- android中子线程更新UI的方式浅析
- 【C++ STL学习之五】容器set和multiset
- jquery阻止事件冒泡
- 最大子数组问题
- VS2010 重置所有的设置
- Spring之AOP面向切片
- Android中子线程更新主线程UI和ProgressBar的应用
- 打开外部文件-如打开pdf文件
- win32 socket的两个简单的例子
- 思科H.264开源解码器将被用在火狐中
- mongo mapreduce
- 简单线程池-实例
- 表达式计算的问题
- ArcGIS Runtime SDK v10.2新特性
- 判断字符串内是否又连续出现n次的方法