android 子线程更新UI

参考http://examples.javacodegeeks.com/android/core/os/handler/android-handler-example/
package
com.example.test1; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.widget.Button; import android.widget.ProgressBar; /* * 使用Handler更新UI * */ public class MyHandlerActivity2 extends Activity { Button button; ProgressBar bar; Handler myHandler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.startButton); bar=(ProgressBar) findViewById(R.id.bar); new Thread(MyThread).start(); // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据 // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象 // (2): 让一个动作,在不同的线程中执行. // 它安排消息,用以下方法 // post(Runnable) // postAtTime(Runnable,long) // postDelayed(Runnable,long) // sendEmptyMessage(int) // sendMessage(Message); // sendMessageAtTime(Message,long) // sendMessageDelayed(Message,long) // 以上方法以 post开头的允许你处理Runnable对象 //sendMessage()允许你处理Message对象(Message里可以包含数据,) myHandler = new Handler(){ public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.d("MyHandler", "handleMessage......"); //super.handleMessage(msg); // 此处可以更新UI Bundle b = msg.getData(); int value = b.getInt("value")*10; MyHandlerActivity2.this.bar.setProgress(value); } }; //myHandler.postDelayed(MyThread, 1500); //myHandler.post(MyThread);//并没有启动新线程 } Runnable MyThread =new Runnable() { public void run() { for (int i = 0; i <= 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("thread.......", "mThread........"); Message msg = new Message(); Bundle b = new Bundle();// 存放数据 b.putInt("value", i); msg.setData(b); //myHandler.sendMessage(myHandler.obtainMessage());//发送的都是0 myHandler.sendMessage(msg); // 向Handler发送消息,更新UI } //myHandler.removeCallbacks(MyThread); } }; }

方法2

package com.example.test1;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Button;
import android.widget.ProgressBar;
/*
 * 使用Handler更新UI
 * */
public class MyHandlerActivity2 extends Activity {
    Button button;
    ProgressBar bar;  
    Handler myHandler;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.startButton);
        bar=(ProgressBar) findViewById(R.id.bar);
        new Thread(MyThread).start();
        // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
        // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
        // (2): 让一个动作,在不同的线程中执行.
        // 它安排消息,用以下方法
        // post(Runnable)
        // postAtTime(Runnable,long)
        // postDelayed(Runnable,long)
        // sendEmptyMessage(int)
        // sendMessage(Message);
        // sendMessageAtTime(Message,long)
        // sendMessageDelayed(Message,long)
        // 以上方法以 post开头的允许你处理Runnable对象
        //sendMessage()允许你处理Message对象(Message里可以包含数据,)
        myHandler = new Handler(){
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                Log.d("MyHandler", "handleMessage......");
                //super.handleMessage(msg);
                // 此处可以更新UI
                Bundle b = msg.getData();
                int value = b.getInt("value")*10;
                MyHandlerActivity2.this.bar.setProgress(value);
            }
        };
        //myHandler.postDelayed(MyThread, 1500);
        //myHandler.post(MyThread);//并没有启动新线程
    }
    Runnable MyThread =new  Runnable() {
        public void run() {
            for (int i = 0; i <= 10; i++) {        
                final int value=i;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                myHandler.post(new Runnable() {
                    
                    @Override
                    public void run() {
                        //Cannot refer to a non-final variable value inside an inner class defined in a different method
                        //因此value要设置为final
                        bar.setProgress(value*10);
                    }
                });
            }
        }
    };
}

posted @ 2013-10-22 16:38  cart55free99  阅读(263)  评论(0编辑  收藏  举报