Android进步之路十:Handler修改UI界面之Demo

来源:互联网 发布:c语言棱形 编辑:程序博客网 时间:2024/05/29 19:58

先大致说下步骤:

1:点击按纽的时候,把线程加入消息对列

2:在线程中,做进度变化的操作

3:由handler向主线程发送修改UI界面的消息

4:由handler负责处理消息并修改UI界面


以下是我自己亲测的小demo

package com.example.handlerprogressbardemo;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;/** * handler机制原理: * 点击开始按纽的时候,1:把线程加入消息对列里面,2:在子线程 里面做一些进度变化的显示。3:通过handler向主线程发送消息, * 请求修改UI界面,4:由handler负责处理消息,最终来修改UI界面。 *  * */public class MainActivity extends Activity {private Handler handler;private Button mStartButton, mEndButton;private ProgressBar bar;//private Runnable updateBarThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initCom();}private void initCom() {bar = (ProgressBar) findViewById(R.id.progressBar);mStartButton = (Button) findViewById(R.id.button_start);mStartButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//第一次把线程加入消息对列handler.post(updateBarThread);}});handler = new Handler(){public void handleMessage(android.os.Message msg) {//handler更新UIbar.setProgress(msg.arg1);handler.post(updateBarThread);if(i>=100){bar.setProgress(0);//这里为什么要对i进行重新赋值啊,是因为,当进度大于100的时候,把进度条虽然清空了,但其实子线程还在//一直不停地走,而这时候i的值肯定是大于100的,所以会看不出效果,所以必须对i进行重新赋值,这样才会循//环操作i = 0;}};};mEndButton = (Button) findViewById(R.id.button_end);mEndButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateBarThread);}});}private int i = 0;Runnable updateBarThread = new Runnable(){//int i = 0;int progress = 1;int count = 10;@Overridepublic void run() {//i = i + 2;i = i + 100/10;//i = i + progress/count;Message msg = handler.obtainMessage();//用arg1提高性能msg.arg1 = i;handler.sendMessage(msg);//睡眠0.5秒try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if(i>=100){handler.removeCallbacks(updateBarThread);}}};}


下面是引用网络的小demo:

Handler与Runnable

[java] view plaincopy
  1. public class MainActivity extends Activity  
  2. {  
  3.     private Button mStartBtn,mEndBtn;  
  4.     private Handler mHandler;  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState)  
  7.     {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.           
  11.         initCom();  
  12.     }   
  13.     private void initCom()  
  14.     {  
  15.           
  16.         mHandler = new Handler();  
  17.         mStartBtn = (Button)findViewById(R.id.button_start);  
  18.         mStartBtn.setOnClickListener(new OnClickListener()  
  19.         {  
  20.             @Override  
  21.             public void onClick(View v)  
  22.             {  
  23.                 //第一次加入消息队列  
  24.                 mHandler.post(r);  
  25.             }  
  26.         });  
  27.           
  28.         mEndBtn = (Button)findViewById(R.id.button_end);  
  29.         mEndBtn.setOnClickListener(new OnClickListener()  
  30.         {  
  31.             @Override  
  32.             public void onClick(View v)  
  33.             {  
  34.                 mHandler.removeCallbacks(r);  
  35.             }  
  36.         });  
  37.     }  
  38.       
  39.     Runnable r = new Runnable()  
  40.     {  
  41.         @Override  
  42.         public void run()  
  43.         {  
  44.             //要这些的操作,写在run()方法内部  
  45.             Log.e("-------""------------");  
  46.             mHandler.postDelayed(r, 1000);  
  47.         }  
  48.     };  
  49. }  


用Handler更新UI

[java] view plaincopy
  1. public class MainActivity extends Activity  
  2. {  
  3.     private Button mStartBtn;  
  4.     private ProgressBar bar;  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState)  
  8.     {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.   
  12.         initCom();  
  13.     }  
  14.   
  15.     private void initCom()  
  16.     {  
  17.   
  18.         bar = (ProgressBar)findViewById(R.id.progressBar1);  
  19.         mStartBtn = (Button) findViewById(R.id.button_start);  
  20.         mStartBtn.setOnClickListener(new OnClickListener()  
  21.         {  
  22.             @Override  
  23.             public void onClick(View v)  
  24.             {  
  25.                 // 第一次把线程加入消息队列  
  26.                 handler.post(updateBarThread);  
  27.             }  
  28.         });  
  29.     }  
  30.   
  31.     Handler handler = new Handler()  
  32.     {  
  33.         public void handleMessage(android.os.Message msg)  
  34.         {  
  35.             //handler更新UI  
  36.             bar.setProgress(msg.arg1);  
  37.             handler.post(updateBarThread);  
  38.         };  
  39.     };  
  40.   
  41.     Runnable updateBarThread = new Runnable()  
  42.     {  
  43.         int i = 0;  
  44.         @Override  
  45.         public void run()  
  46.         {  
  47.             i = i + 10;  
  48.             Message msg = handler.obtainMessage();  
  49.             msg.arg1 = i;//用arg1,提高性能  
  50.             handler.sendMessage(msg );  
  51.             //睡眠1秒  
  52.             try  
  53.             {  
  54.                 Thread.sleep(1000);  
  55.             }  
  56.             catch (InterruptedException e)  
  57.             {  
  58.                 e.printStackTrace();  
  59.             }  
  60.             if (i == 100)  
  61.             {  
  62.                 handler.removeCallbacks(updateBarThread);  
  63.             }  
  64.               
  65.         }  
  66.     };  
  67. }  

xml中进度条:

[html] view plaincopy
  1. <ProgressBar  
  2.         android:id="@+id/progressBar1"  
  3.         style="@android:style/Widget.ProgressBar.Horizontal"  
  4.         android:layout_width="fill_parent"  
  5.         android:layout_height="wrap_content" />  

Timer与Handler:

[java] view plaincopy
  1. public class MainActivity extends Activity  
  2. {  
  3.     protected static final int NUM_1 = 1;  
  4.     private TextView textView;  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState)  
  8.     {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.   
  12.         initCom();  
  13.     }  
  14.   
  15.     private void initCom()  
  16.     {  
  17.         textView = (TextView) findViewById(R.id.textView);  
  18.   
  19.         Timer timer = new Timer();  
  20.         timer.schedule(new TimerTask()  
  21.         {  
  22.             @Override  
  23.             public void run()  
  24.             {  
  25.                 Message msg = new Message();  
  26.                 msg.arg1 = 1;  
  27.                 handler.sendMessage(msg);  
  28.             }  
  29.         }, 2000);  
  30.     }  
  31.   
  32.     Handler handler = new Handler()  
  33.     {  
  34.         public void handleMessage(android.os.Message msg)  
  35.         {  
  36.             // handler更新UI  
  37.             switch (msg.arg1)  
  38.             {  
  39.             case NUM_1:  
  40.                 textView.setText("test");  
  41.                 break;  
  42.             default:  
  43.                 break;  
  44.             }  
  45.         };  
  46.     };  
  47. }  
0 0
原创粉丝点击