耗时操作
1.什么是ANR
在应用程序的主线程中执行一段耗时的代码, 就有可能出现ANR异常.
耗时的代码未执行结束时, 界面会卡住, 用户对界面进行了操作, 10秒之后耗时代码如果还未结束, 就会出现ANR异常
* 2.怎么避免ANR
主线程中不要执行耗时的代码
如果一定要做耗时的事情, 开启新线程, 在新线程中执行
3.UI Thread
安卓手机中主线程负责刷新界面, 以及处理用户的操作
应用程序的界面都是由主线程创建的
界面的修改也只能在主线程中执行
** 4.Handler
有的时候我们需要执行一些耗时的代码, 会开启新线程, 这时又需要更新界面, 必须在主线程中操作, 那么就需要使用Handler来进行线程之间的通信
a.sendMessage():
新线程向主线程发送一个包含数据的消息, 主线程获取消息中的数据
在主线程中创建Handler子类对象, 重写handleMessage()方法
新线程中可以使用Handler的引用调用sendMessage()方法, 发送一个Message对象
只要执行了sendMessage()方法, 那么主线程会自动执行handleMessage()方法, 收到Message对象
b.post():
新线程向主线程发送一段代码, 主线程直接执行
在主线程中创建Handler对象
新线程中可以使用Handler调用post()方法发送一个Runnable对象
主线程会自动执行Runable的run()
运行结果图:
示例代码:
package com.oterman.myhandler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tv1=null;
TextView tv2=null;
int j;
//sendmessage方式;
Handler msgHandler=new Handler(){
public void handleMessage(Message msg) {
tv1.setText(msg.obj.toString());
}
};
Handler postHandler=new Handler();//post方式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView) findViewById(R.id.tv1);
tv2=(TextView) findViewById(R.id.tv2);
}
//按钮一点击相应函数
public void go1(View v){
tv1.setText("军哥好");
new Thread(new Runnable() {
public void run() {
for(int i=0;;i++){
//采取发送消息的方式,将主线程要执行的代码封装成消息对象,然后send出去;
Message msg=new Message();
msg.obj=i;
msgHandler.sendMessage(msg);
SystemClock.sleep(1000);
}
}
}){}.start();
}
//按钮2的点击响应函数,采用post方式提交要处理的消息给主线程;
public void go2(View v){
tv2.setText("俊哥棒");
System.out.println("go:"+Thread.currentThread().getName());
new Thread(new Runnable() {
public void run() {
for(j=0;;j+=2){
System.out.println("for:"+Thread.currentThread().getName());
postHandler.post(new Runnable() {
public void run() {//主线程要执行的代码;
System.out.println("post_run:"+Thread.currentThread().getName());
tv2.setText(j+"");
}
});
SystemClock.sleep(1000);
}
}
}){}.start();
}
}