现在的位置: 首页 > 综合 > 正文

android开发中的ANR异常

2012年02月19日 ⁄ 综合 ⁄ 共 1566字 ⁄ 字号 评论关闭

1、什么是ANR异常?

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

image

代码示例:

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

image

抱歉!评论已关闭.