Android:ANR、线程间通讯、Handler、Message
场景:点击按钮1进行下载,显示进度条进度变化,10秒后下载完成,进度条消失;点击按钮2完成更新,出现转动进度条,5秒后更新完毕进度条消失。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 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 + "]" ; } } } 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1206262,如需转载请自行联系原作者