【发布时间】:2014-04-30 11:44:00
【问题描述】:
我对异步任务非常陌生,但我为我的应用程序创建的少数任务需要访问类级别的变量,并且有时在 doInBackground() 中针对实际设备上的这些任务有一些空指针异常。
我相信这是因为这些变量不应该真正从异步任务中访问,而是通过构造函数或参数等传递。例如,如果我转换到活动 B 并且异步任务仍在从活动运行A,A 的所有变量都应该为 null 不是吗?
如果永远不应该在异步任务的上下文中使用访问这些变量,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
}
}
}
【问题讨论】:
-
在某些情况下访问这些变量是完全可以的,只要您跨线程正确访问它们。鉴于您的问题的具体情况,我倾向于将变量传递给您的构造函数,但是我认为最好的建议将在您发布相关代码之后出现。
-
我觉得这个问题对你有用stackoverflow.com/questions/154551/…
标签: android asynchronous android-asynctask android-studio scope