1、什么是ANR异常?

application not response 应用程序无响应。在用户进行一个操作,如果用户在6秒内没有操作的话,就会出现异常

android开发中的ANR异常_bundle

代码示例:

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();
}
}

android开发中的ANR异常_bundle_02




感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends!