【问题标题】:Android - Is it wrong to access class level variables from an Async task?Android - 从异步任务访问类级别变量是否错误?
【发布时间】: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


【解决方案1】:

您绝对应该避免在 Activity 中使用 AsyncTask 作为内部类。内部类包含对其容器类的隐式强引用,因此您冒着获得空指针的风险,就像您在活动生命周期中所经历的那样。如果 Activity B 位于 Activity A 之上,它不仅会发生。如果您旋转设备也可能发生这种情况。

问题在于活动生命周期(这就是您的 IDE 不给您警告的原因)。对于配置更改(例如轮换),或在内存不足的情况下,可以销毁并重新创建 Activity。但是您的 AsyncTask 仍将与旧活动相关联。

有很多关于这个的线程:

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

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

您还可以查看旨在处理此问题的第三方框架:

https://github.com/stephanenicolas/robospice

Google 也可以获取更多信息,这并不是一个详尽的列表。

【讨论】:

    【解决方案2】:

    我为您提供两个链接。 首先阅读并尝试理解 我希望您将来会解决有关 Android Asynctask 问题的任何问题。

    链接 1 Android Asynctask Example

    和 链接2Android Background Processing with Handlers and AsyncTask and Loaders - Tutorial

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多