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 之類的方式會更方便些...
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 之類的方式會更方便些...
留言
張貼留言