android 运用Message机制更新UI线程界面

1.实现自己的Handler,对消息进行处理
2.在新的线程中发送消息

源码 main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        android:gravity="center"
        android:id="@+id/txtView" />
    <ProgressBar
        android:id="@+id/downloadbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="20px" />
    
</LinearLayout>

处理信息源码
  
package demo.bit.testthread;

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.view.MotionEvent;
import android.widget.ProgressBar;
import android.widget.TextView;

public class TestThread extends Activity {
    /** Called when the activity is first created. */
	private TextView txtView;
	private ProgressBar downLoadBar;
	MyHandler myHandler;
	private MyThread myThread;
	private boolean isExit = true;
	private boolean isQuit = false;
	 int count = 0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i("TestThread", Thread.currentThread().getName());
        txtView = (TextView) findViewById(R.id.txtView);
        downLoadBar = (ProgressBar) findViewById(R.id.downloadbar);
        myHandler = new MyHandler();
    }
    private class MyHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			downLoadBar.setProgress(msg.arg1);
			txtView.setText(String.valueOf(msg.arg1));
			super.handleMessage(msg);
		}
    }
    private class MyThread extends Thread{

		@Override
		public void run() {
			int i = 0 ;
			isExit = false;
			downLoadBar.setMax(100);
			Message msg = null;
			while (i++ < 100  )
			{
				msg = myHandler.obtainMessage();
				msg.arg1 = i;
				Log.i("FF", msg.getTarget().toString());
				msg.sendToTarget();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				Log.i("MyThread", ""+i);
				if(isQuit) break;
			}
			isExit = true;
			super.run();
		}
    }
    @Override
	protected void onDestroy() {
		// TODO Auto-generated method stub	
    	isQuit = true;
    	try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    	myThread.interrupt();
    	myThread.stop();
		super.onDestroy();
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if(event.getAction() == MotionEvent.ACTION_DOWN){
			if(isExit){
				myThread = new MyThread();
				myThread.start();
			}
		}
		return super.onTouchEvent(event);
	}
}
注:

1.Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue( 车队,消息隧道) 。

2.Handler: 你可以构造Handler 对象来与Looper 沟通,以便push 新消息到Message Queue 里;或者接收Looper( 从Message Queue 取出) 所送来的消息。每个handler对象与其创建的线程相关联,只能有一个相关联。

3. Message Queue( 消息队列): 用来存放线程放入的消息。

4.线程:UI thread 通常就是main thread ,而Android 启动程序时会替它建立一个Message Queue 。
      5.启动进程运行时,如若推出应用了,为了系统的性能,一般要将所开启的线程杀死,java的线程销毁的处理过程一般是通过外部变量使得正在运行的线程退出run方法,再将它停止。
      6.android应用程序的界面的更新只能在UI主线程中更新,子线程是不能操作UI的,只能进行数据、系统 等其他非UI的操作。
     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值