Android - 从异步任务访问类级别变量是错误的吗?

时间:2014-04-30 11:44:01

标签: android asynchronous android-asynctask android-studio scope

我对异步任务很陌生,但是我为我的应用程序创建的少数几个需要访问类级变量,而且我在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
    }
 }
}

2 个答案:

答案 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

最好的运气!