我對異步任務非常陌生,但爲應用程序創建的少數幾個需要訪問類級變量,並且有時在doInBackground()中爲實際設備上的這些任務創建了一些空指針異常。Android - 訪問異步任務中的類級別變量是否錯誤?
我認爲這是因爲這些變量實際上不應該從異步任務中訪問,而是通過構造函數或參數傳入。例如,如果我轉換到活動B並且異步任務仍在運行活動A,A的所有變量都不應該爲空?
如果訪問這些變量不應該從異步任務的上下文中使用,IDE(Android Studio在我的情況下)是否應警告我這是一個危險的操作?
編輯:哇這麼快就幫助這麼快!希望這也能在將來幫助其他人。下面是一些代碼,大致就是我在想:
public class MyActivity extends ActionBarActivity {
private Context mContext;
private User mUser;
private ProgressDialog mProgressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
mProgressDialog = new ProgressDialog(mContext);
mUser = new User();
new MyAsyncTask.execute();
}
private class MyAsyncTask extends AsyncTask<Params, Integer, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.setIndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setCancelable(true);
mProgressDialog.setMessage("My message");
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
}
@Override
protected Void doInBackground(Params... params) {
Toast.makeText(mContext, "In doInBackground()", Toast.LENGTH_LONG).show();
mUser.someMethodThatTakesTime();
return null;
}
@Override
protected void onPostExecute(Void params) {
mProgressDialog.dismiss();
//Possibly launch another activity
}
}
}
只要您通過線程正確訪問這些變量,有些情況下完全可以訪問這些變量。考慮到你的問題的細節,我會傾向於將變量傳遞給你的構造函數,但是我認爲在你發佈相關代碼之後,最好的建議就來了。 – Phil
我認爲這個問題對你很有用http://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock?rq=1 – CurlyPaul