设为首页 加入收藏

TOP

关于Android Force Close 出现的原因 以及解决方法(一)
2017-10-13 10:35:54 】 浏览:5908
Tags:关于 Android Force Close 出现 原因 以及 解决 方法

一、原因:

forceclose,意为强行关闭,当前应用程序发生了冲突。

NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常

 

二、如何避免

如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtException方法 代码如下:

public class MainActivity extends Activity implements Thread.UncaughtExceptionHandler,
        View.OnClickListener {
    private List<String> mList = new ArrayList<String>();
    private Button btn;

    private int pid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i("tag", "--->>onCreate");

        initView();
        //设置处理异常的handler
        Thread.setDefaultUncaughtExceptionHandler(this);

    }

    /**
     * 初始化控件
     */
    private void initView() {
        btn = (Button) findViewById(R.id.main_btn);
        btn.setOnClickListener(this);

    }

    @Override
    public void uncaughtException(Thread arg0, Throwable arg1) {
        // TODO Auto-generated method stub
        Log.i("tag",  "截获到forceclose,异常原因为:" + "\n" +
                arg1.toString()+"  Thread:"+arg0.getId());
       // finish();//结束当前activity
        android.os.Process.killProcess(android.os.Process.myPid());
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch (arg0.getId()) {
            case R.id.main_btn:
                mList.get(1) ;//产生异常
                break;

            default:
                break;
        }
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("tag", "--》onpause");
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        Log.i("tag", "--->onstop");
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.i("tag", "-->ondestroy");
    }
}

 再补充一句,想要哪个线程可以处理未捕获异常,Thread.setDefaultUncaughtExceptionHandler( this); 这句代码都要在那个线程中执行一次

在uncaughtException方法中,第一个参数是线程,第二个参数是异常。

 public void uncaughtException(Thread arg0, Throwable arg1) {
        // TODO Auto-generated method stub
        Log.i("tag",  "截获到forceclose,异常原因为:" + "\n" +
                arg1.toString()+"  Thread:"+arg0.getId());
       // finish();//结束当前activity
        android.os.Process.killProcess(android.os.Process.myPid());
    }

 接下来,看log日志的结果:

08-0918:50:27.87410739-10739/example.com.force_anrI/tag:--->>onCreate
08-0918:50:31.66410739-10739/example.com.force_anrI/tag:forceclose
java.lang.IndexOutOfBoundsException:Invalidindex1,sizeis0Thread:1

成功捕获到了异常,而且activity也退出了,可是并不是安全退出,因为当你再次点击打开apk时,发现程序无响应。

为了解决上述问题,我在uncaughtException方法里将进程杀死,杀死进程有好多中方法,在此列举一个自杀式方法

修改如下: 

@Override  
    public void uncaughtException(Thread arg0, Throwable arg1) {  
        // TODO Auto-generated method stub  
        Log.i("tag",  "截获到forceclose,异常原因为:" + "\n" +  
                   arg1.toString());  
         android.os.Process.killProcess(android.os.Process.myPid()); //
    }  其他程序未变。。

3,我们不仅可以在主线程中这么做,还可以在子线程中进行:

然后在activity的生命周期中开启子线程,监听未捕获异常的发生。

class MyRunnable extends Thread implements Thre
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇实现购物车那种加减效果 下一篇Android Studio+WebApi(一)属于我..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目