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
<span>	</span>public void run() {
<span>			</span>try {
<pre name="code" class="java"><span style="white-space:pre">			</span>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中同样可以放 其他内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值