handler学习

使用handler是一个原因是因为  只有在 View所在的activity中才能更新 View

在自己定义的子线程中更新View就会出错例如:

@Override
public void run() {
try {
sleep(1000);

textView.setText("after_textView");
catch (InterruptedException e) {
e.printStackTrace();
}
}

就会报 only the original thread that created a view.......的错误, Android UI操作不是线程安全的,并且这些操作必须在UI线程中执行

所以如果要在子线程中更新 view 就必须使用:

package test.handler;

import com.example.androidtest.R;


import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

public class HandlerThread extends Thread{

	private TextView textView;
	private Handler handler;
	
	HandlerThread(TextView textView,Handler handler){
		this.textView=textView;
		this.handler=handler;
	}
	
	@Override
	public void run() {
			try {
			sleep(1000);
			handler.post(new Runnable() {
				
				@Override
				public void run() {
					textView.setText("after_textView");
				}
			});
			
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	
	}
}

然而我遇到的一个问题是

如果在sleep之前修改view 就不会出错,我也不知道原因,希望有大神指点

@Override
	public void run() {
			try {
			textView.setText("after_textView");
sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }


handle还可以延时操作,从做完一次run后延时一秒在继续做:

package test.handler;

import com.example.androidtest.R;

import android.app.Activity;
import android.media.Image;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private ImageView imageView;
	private TextView textView;
	private Handler handler = new Handler();
	private int[] image={R.drawable.image1,R.drawable.image2,R.drawable.image3};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_handler);

		textView = (TextView) findViewById(R.id.textView);
		imageView = (ImageView) findViewById(R.id.imageView);
		
		
		handler.postDelayed(handlerThread, 1000);
	}
	
	HandlerThread handlerThread=new HandlerThread();
	public class HandlerThread extends Thread{

		private int runNum=0;

		@Override
		public void run() {
			runNum=runNum%3;
			imageView.setBackgroundResource(image[runNum]);
			runNum++;
			handler.postDelayed(handlerThread, 1000);
		}
	}

}


handler 还有一个作用就是发送消息,两线程之间通信:

package test.handler;

import java.security.PublicKey;

import com.baidu.platform.comapi.map.m;
import com.example.androidtest.R;

import android.app.Activity;
import android.media.Image;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView;
	private Handler handler=new Handler(){
		public void handleMessage(Message message){
			textView.setText(message.arg1+"+"+message.arg2);
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test_handler);

		textView = (TextView) findViewById(R.id.textView);
		
		new Thread(){
			public void run(){
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				Message message=new Message();
				message.arg1=34;
				message.arg2=22;
				
				handler.sendMessage(message);
			}
		}.start();
	}
	
	

}
发送消息这种方法同样也可以实现图片一秒一个背景


在Message中同样可以放 其他内容

你可能感兴趣的:(android)