跳到主要內容

Android AsyncTask 較佳的 Exception 處理方式

Android 在 4.0 以後規定有網路連線的程式必須寫在另外的Thread,主Thread 負責處理與UI相關的部分
Android裡的 AsyncTask 是符合這個需求比較好的解法,他本身實作了 Java 的 concurrent 套件
所以透過它可以省掉一些實作上的細節

只是App中最常碰到的 Exception 大多是網路連線引發的
一旦沒有處理到 Exception 就很容易導致 App crash
App 本身的 Exception 處理不像 Java Web 那樣有 filter、error page 等機制
參考討論後大概是以下方式比較好處理 Multi-Thread 引發的 Exception

public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
    private String mEmail;
    private String mPassword;
    private Exception exceptionToBeThrown;

    UserLoginTask(String email, String password) {
        mEmail = email;
        mPassword = password;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            ....  //network connection
        } catch (Exception e) {
            exceptionToBeThrown = e;
            return false;
        }

        return true;
    }

    @Override
    protected void onPostExecute(final Boolean success) {
        mAuthTask = null;
        showProgress(false);
     
        if(exceptionToBeThrown != null){
             LoginActivity.this.ExceptionHandler(exceptionToBeThrown);
             return;
        }

        .....
    }

}

當 AsyncTask 開另一條 Thread 執行 doInBackground 裡的內容時
如果產生 Exception 就把它先儲存在AsyncTask繼承類別裡的變數裡
待回到UI Thread的時候再執行另外定義的處理流程

private void ExceptionHandler(Exception e){
    Log.e(Const.debugTag, e.getMessage(), e);
    new AlertDialog.Builder(this)
                        .setTitle("Error occurs!")
                        .setMessage("There is something wrong")
                        .show();
}


我想如果Google能夠多加 onPostExecuteError 之類的方式會更方便些...

留言