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