Android捕獲全局異常


Android捕獲全局異常

程序避免不了出現bug,導致程序崩潰,為了盡量不影響用戶體驗,可以全局捕獲異常

效果圖

  • 異常捕獲處理前

P1

  • 異常捕獲處理后(將程序重新啟動)

P2

捕獲異常的工具類

package com.example.kongqw.exceptiondemo;

import android.content.Context;
import android.support.v7.internal.app.ToolbarActionBar;
import android.util.Log;
import android.widget.Toast;

/** * Created by kongqw on 2015/11/3. */
public class KqwException implements Thread.UncaughtExceptionHandler {
    private static KqwException myCrashHandler;

    private Context mContext;

    private KqwException(Context context) {
        mContext = context;
    }

    public static synchronized KqwException getInstance(Context context) {
        if (null == myCrashHandler) {
            myCrashHandler = new KqwException(context);
        }
        return myCrashHandler;
    }

    public void uncaughtException(Thread thread, Throwable throwable) {
        long threadId = thread.getId();
        String message = throwable.getMessage();
        String localizedMessage = throwable.getLocalizedMessage();
        Log.i("KqwException", "------------------------------------------------------");
        Log.i("KqwException", "threadId = " + threadId);
        Log.i("KqwException", "message = " + message);
        Log.i("KqwException", "localizedMessage = " + localizedMessage);
        Log.i("KqwException", "------------------------------------------------------");
        throwable.printStackTrace();
        Log.i("KqwException", "------------------------------------------------------");

        // TODO 下面捕獲到異常以后要做的事情,可以重啟應用,獲取手機信息上傳到服務器等
        Log.i("KqwException", "------------------應用被重啟----------------");
        // 重啟應用
        mContext.startActivity(mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()));
        //干掉當前的程序
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

使用

在Application下添加Handler

注冊Application

在清單文件下添加name屬性

<application  …… android:name=".InitApplication" …… >
    <activity  …… >
        <intent-filter>
            ……
        </intent-filter>
    </activity>
</application>

Application

package com.example.kongqw.exceptiondemo;

import android.app.Application;

/** * Created by kongqw on 2015/11/3. */
public class InitApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        KqwException handler = KqwException.getInstance(this);
        Thread.setDefaultUncaughtExceptionHandler(handler);
    }
}

測試類

package com.example.kongqw.exceptiondemo;

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void bug(View view) {
        Toast.makeText(this, "程序崩潰", Toast.LENGTH_SHORT).show();
        // 除數為0 導致程序崩潰
        int a = 1 / 0;
    }
}

XML布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".MainActivity" tools:showIn="@layout/activity_main">

    <Button  android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="bug" android:text="點擊程序崩潰" />
</RelativeLayout>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM