Android:ANR、线程间通讯、Handler、Message
2013-05-21 19:54
471 查看
场景:点击按钮1进行下载,显示进度条进度变化,10秒后下载完成,进度条消失;点击按钮2完成更新,出现转动进度条,5秒后更新完毕进度条消失。
public class MainActivity extends Activity implements OnClickListener { TextView textView = null; private ProgressBar mProgress_yuan; private ProgressBar mProgress_jindu; private final int MSG_WHAT_DOWNLOAD = 1; private final int MSG_WHAT_UPDATE = 2; private final int MSG_WHAT_PROGRESS = 3; private Handler mHandler = new Handler()// Handler运行于main线程,在main线程接收消息 { @Override public void handleMessage(Message msg)// 重写handleMessage方法 { switch (msg.what) { case MSG_WHAT_DOWNLOAD: Data data = (Data) msg.obj; textView.setText(data.toString()); mProgress_jindu.setVisibility(View.GONE);// 下载完成后,进度条消失 break; case MSG_WHAT_UPDATE: String str = (String) msg.obj; textView.setText(str); mProgress_yuan.setVisibility(View.GONE);// 更新完毕后,圆形进度框消失 break; case MSG_WHAT_PROGRESS: int arg = msg.arg1; mProgress_jindu.setProgress(arg);// 每次接收消息,更新进度条 break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); textView = (TextView) findViewById(R.id.textView1); mProgress_yuan = (ProgressBar) findViewById(R.id.progressBar1); mProgress_jindu = (ProgressBar) findViewById(R.id.progressBar2); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: btn1Click(); break; case R.id.button2: btn2Click(); break; default: break; } } private void btn1Click()// 点击下载,10秒后下载完成,进度条消失 { mProgress_jindu.setVisibility(View.VISIBLE);// 点击时进度条显示(xml设置默认隐藏) new Thread() { @Override public void run() { Message message = new Message(); message.what = MSG_WHAT_DOWNLOAD; // 设置标识 message.obj = download();// 将返回结果赋给msg,调用下载方法时同时发消息更新进度条 mHandler.sendMessage(message);// 通过Handler传递msg } }.start(); } private void btn2Click()// 点击更新,圆形进度条转动,3秒后更新完成,进度条消失 { mProgress_yuan.setVisibility(View.VISIBLE); new Thread() { @Override public void run() { try { Thread.sleep(3000); String str = update(); //Message msg = mHandler.obtainMessage(what, obj) //下面部分可以采用上面的方法优化 Message msg = new Message(); msg.what = MSG_WHAT_UPDATE; msg.obj = str; mHandler.sendMessage(msg); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } private Data download() { for (int i = 0; i < 10; i++)// 模拟下载进度过程 { //Message msg = new Message(); Message msg = mHandler.obtainMessage();//从系统的资源池获取复用msg,避免重复创建msg对象 msg.what = MSG_WHAT_PROGRESS; msg.arg1 = i * 10; mHandler.sendMessage(msg);// 每次进度发消息给main线程更新进度条 try { Thread.sleep(1000);// 10秒后下载完成 } catch (InterruptedException e) { e.printStackTrace(); } } Data data = new Data("下载完成!", 12); return data; } private String update() { return "更新完成!"; } class Data { String name; int num; public Data(String name, int num) { super(); this.name = name; this.num = num; } @Override public String toString() { return "data [name=" + name + ", num=" + num + "]"; } } }
相关文章推荐
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android-线程通讯设计模式-Handler消息模型
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android线程相关_Handler_Message_AsyncTask
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android基础之单线程模型中Message、Handler、Message Queue、Looper之间的关系
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)
- Android开发之单线程模型中Message、Handler、MessageQueue、Looper之间的关系
- Android:线程间通讯的其他方法、runOnUiThread(action)、Handler.post(action)、post
- Android之多线程通讯handler和Message(一)
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android 线程4件套 MessageQueue Message Looper Handler之Looper
- Android异步消息处理线程之----Looper+MessageQueue+Handler
- Android 通过handler和message在子线程里面去更新UI