Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Force Close和ANR等異常處理方法

Android Force Close和ANR等異常處理方法

編輯:關於Android編程

對android應用而言最常出現的異常是Force close和ANR(Application is not response).

對於這兩類錯誤而言,應用是可以進行相關處理的。

一 Forceclose這類問題主要通過Thread.UncaughtExceptionHandler這個類來捕獲異常。通過實現類裡面的方法uncaughtException來實現應用在捕獲到異常後進行相關的處理。一般這裡處理基本放在應用的Application類中。為了方便大家進行相關處理,我這裡寫了個類,大家直接在Application回調即可。

 

new ExceptionHandler(mContext).setFCListener(new ExceptionHandler.FCListener() {
            
            @Override
            public void onFCDispose(Throwable paramThrowable) {
                Log.d(TAG, onFCListerner enter!!!);
                new Thread(){
                    public void run(){
                        Looper.prepare();
                        Toast.makeText(mContext, APP is Force Close do what you want!, Toast.LENGTH_LONG).show();
                        Looper.loop();
                    }
                }.start();
            }
        });

 

同樣的對於ANR問題,應用也可以做相關處理。對ANR,我們可以這樣處理。通過一個看門狗來實時的檢測主線程,一旦主線程發生阻塞,則通知Application 做相關處理。

主要方法是在線程中每隔一段時間(Activity一般是5S,廣播一般是10S),向主線程發送一個messager,使計數器加1,如果到點沒有加1,則表明主線程阻塞。

@Override
    public void run() {
        setName(|ANR-WatchDog|);

        int lastTick;
        while (!isInterrupted()) {
            lastTick = mTick;
            mUIHandler.post(tickerRunnable);
            try {
                Thread.sleep(mTimeoutInterval);
            }
            catch (InterruptedException e) {
                mInterruptionListener.onInterrupted(e);
                return ;
            }

            // If the main thread has not handled _ticker, it is blocked. ANR.
            if (mTick == lastTick) {
                ANRError error;
                if (mNamePrefix != null)
                    error = ANRError.New(mNamePrefix, mLogThreadsWithoutStackTrace);
                else
                    error = ANRError.NewMainOnly();
                mAnrListener.onAppNotResponding(error);
                return ;
            }
        }
    }
 private final Runnable tickerRunnable = new Runnable() {
        @Override public void run() {
            mTick = (mTick + 1) % 10;
        }
    };
 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved