1、什么是ANR异常?
application not response 应用程序无响应。在用户进行一个操作,如果用户在6秒内没有操作的话,就会出现异常
代码示例:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void doSomething(View view) throws Exception {
try {
Thread.sleep(10000);//让主线程睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("从网络获取数据成功!");
}
public void toast(View view) {
Toast.makeText(this, "十八大开幕了!", 0).show();
}
}
2、为什么会出现ANR异常?
android系统中处理用户操作的工作时在主线程中执行的,如果我们的程序在主线程中进行一些耗时的操作,导致用户的操作6秒不能够处理,就会出现异常。
主线程休眠,那么再点击程序,必须等主线程睡醒后才会反应。
所以在主线程中不要做太耗时的工作,因为主界面会阻塞。
3、解决办法:让这些耗时的操作放在新线程里面操作。
注意:如果新线程里面做的事情要更新界面的话,就要使用handler来操作。
连接网络的事都要放在新线程里面的。
解决代码(包括更新界面的操作,使用的是handler):
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView numTV;
private Handler handler = new Handler();
private int i;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
numTV = (TextView) findViewById(R.id.numTV);
}
public void doSomething(View view) throws Exception {
new Thread() {
public void run() {
for (i = 1; i < 20; i++) {
handler.post(new Runnable() {
public void run() {
numTV.setText(i + "");
}
});
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
public void toast(View view) {
Toast.makeText(this, "十八大开幕了!", 0).show();
}
}
|