0

我對異步任務非常陌生,但爲應用程序創建的少數幾個需要訪問類級變量,並且有時在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 
    } 
} 
} 
+0

只要您通過線程正確訪問這些變量,有些情況下完全可以訪問這些變量。考慮到你的問題的細節,我會傾向於將變量傳遞給你的構造函數,但是我認爲在你發佈相關代碼之後,最好的建議就來了。 – Phil

+0

我認爲這個問題對你很有用http://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock?rq=1 – CurlyPaul

回答

1

你絕對應該避免在活動使用AsyncTask作爲一個內部類。內部類包含對其容器類的隱式強引用,因此您可能會冒險獲得像活動生命週期中所體驗的空指針。如果活動B位於活動A的頂部,則不會發生這種情況。如果您旋轉設備,也可能發生這種情況。

問題是活動生命週期(這就是爲什麼你的IDE不給你警告)。對於配置更改(例如旋轉)或內存不足的情況,可以銷燬並重新創建活動。但是你的AsyncTask仍然會與舊的活動聯繫在一起。

有很多的線程這一點:

https://stackoverflow.com/a/8550351/1856960

https://stackoverflow.com/a/16305144/1856960

您也可以考慮第三方框架設計來處理這個:

https://github.com/stephanenicolas/robospice

谷歌周圍的更多信息,這不是一個詳盡的清單。