使用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中同样可以放 其他内容