我对异步任务很陌生,但是我为我的应用程序创建的少数几个需要访问类级变量,而且我在doInBackground()中有一些空指针异常,用于在真实设备上执行这些任务。 / p>
我相信这是因为这些变量实际上不应该从异步任务中访问,而是通过构造函数或参数等传入。例如,如果我转换到活动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 :(得分:1)
您绝对应该避免在活动中使用AsyncTask
作为内部类。内部类包含对其容器类的隐式强引用,因此您冒着获取活动生命周期中遇到的空指针的风险。如果活动B位于活动A之上,则不会发生这种情况。如果您也旋转设备,也会发生这种情况。
问题是活动生命周期(这就是你的IDE没有给你警告的原因)。对于配置更改(例如旋转)或低内存情况,可以销毁和重新创建活动。但是你的AsyncTask仍将与旧活动挂钩。
关于这一点有很多线索:
https://stackoverflow.com/a/8550351/1856960
https://stackoverflow.com/a/16305144/1856960
您还可以查看旨在解决此问题的第三方框架:
https://github.com/stephanenicolas/robospice
谷歌周围也有更多信息,这不是一个详尽的清单。
答案 1 :(得分:1)
我提供了两个链接。 首先阅读并尝试理解 我希望您将来解决有关Android Asynctask问题的任何问题。
link 1 Android Asynctask Example
和 链接2 Android Background Processing with Handlers and AsyncTask and Loaders - Tutorial
最好的运气!