Android线程问题(Handler+Runnable)让你对线程理解更深刻
很多刚学习android的人,都不太熟悉用handler更新主线程ui的具体原理,本文将给你讲述!
1 public class MainActivity extends Activity {
2 Button button;
3 TextView textview;
4 ProgressBar progressBar;
5 MyHandler mhandler;
6 MyThread mthread;
7 /** Called when the activity is first created. */
8 @Override
9 public void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState);
11 setContentView(R.layout.main);
12 button=(Button)findViewById(R.id.bt);
13 textview=(TextView)findViewById(R.id.tv);
14 progressBar=(ProgressBar)findViewById(R.id.pb);
15 progressBar.setMax(100);
16 button.setOnClickListener(new View.OnClickListener() {
17
18 @Override
19 public void onClick(View v) {
20 // TODO Auto-generated method stub
21 mhandler=new MyHandler();
22 mthread=new MyThread();
23 new Thread(mthread).start();
24 Log.i("++++++++++", "onCreate--The Thread is: "+Thread.currentThread().getId());
25 }
26 });
27 }
28 //这里要实现handlermessage方法来处理传过来的msg,要记住是先进先出原则
29 class MyHandler extends Handler{
30 @Override
31 public void handleMessage(Message msg) {
32 Log.i("-----", "Handler--The ThreadId is: "+Thread.currentThread().getId());
33 super.handleMessage(msg);
34 Bundle b1=msg.getData();
35 String textStr0=textview.getText().toString();
36 String textStr1=b1.getString("textStr");
37 MainActivity.this.textview.setText(textStr0+" "+textStr1);
38 int i = b1.getInt("barvalue");
39 MainActivity.this.progressBar.setProgress(i);
40 }
41 }
42 //再一个新线程里来向主线程发送消息,配合ui更新
43 class MyThread implements Runnable {
44 int i=1;
45 @Override
46 public void run() {
47 // TODO Auto-generated method stub
48 while(i<11){
49 Log.i("_+_+_+_+_+","Thread--The ThreadId is: "+Thread.currentThread().getId());
50 try {
51 Thread.sleep(1000);
52 } catch (InterruptedException e) {
53 e.printStackTrace();
54 }
55 Message m=new Message();
56 Bundle b =new Bundle();
57 b.putString("textStr", "线程运行"+i+"次");
58 b.putInt("barValue", i*10);
59 i++;
60 m.setData(b);
61 // 通过sendMessage向Handler发送更新UI的消息
62 MainActivity.this.mhandler.sendMessage(m);
63 }
64 }
65 }
66 }

这个是运行后的结果,你会看到Oncreate里只会执行一次,剩下的就是子线程与主线程更新ui的一些交互,最后结束。

浙公网安备 33010602011771号