Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-从异步任务访问类级变量是否错误?_Android_Asynchronous_Android Asynctask_Android Studio_Scope - Fatal编程技术网

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

Android-从异步任务访问类级变量是否错误?,android,asynchronous,android-asynctask,android-studio,scope,Android,Asynchronous,Android Asynctask,Android Studio,Scope,我对异步任务非常陌生,但我为我的应用程序创建的少数任务需要访问类级变量,并且在现实设备上的这些任务的doInBackground()中有时会出现一些空指针异常 我认为这是因为这些变量实际上不应该从异步任务中访问,而是通过构造函数或参数等传递进来。例如,如果我转换到活动B,而异步任务仍然从活动A运行,那么A的所有变量都应该为null,不是吗 如果不应该在异步任务的上下文中使用访问这些变量,IDE(在我的例子中是Android Studio)不应该警告我这是一个危险的操作吗 编辑:哇,这么多的帮助这

我对异步任务非常陌生,但我为我的应用程序创建的少数任务需要访问类级变量,并且在现实设备上的这些任务的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
    }
 }
}
公共类MyActivity扩展了ActionBarActivity{
私有上下文;
私人用户缪斯;
private ProgressDialog mProgressDialog;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mContext=这个;
mProgressDialog=新建进度对话框(mContext);
mUser=新用户();
新建MyAsyncTask.execute();
}
私有类MyAsyncTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
mProgressDialog.setUndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE\u微调器);
mProgressDialog.setCancelable(真);
设置消息(“我的消息”);
mProgressDialog.show();
}
@凌驾
受保护的void onProgressUpdate(整数…进度){
super.onProgressUpdate(进度);
}
@凌驾
受保护的Void doInBackground(参数…参数){
Toast.makeText(mContext,“In-doInBackground()”,Toast.LENGTH_LONG.show();
缪斯:某种需要时间的方法;
返回null;
}
@凌驾
受保护的void onPostExecute(void参数){
mProgressDialog.disclose();
//可能会发起另一项活动
}
}
}

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

问题在于活动生命周期(这就是IDE不向您发出警告的原因)。对于配置更改(如旋转),或在内存不足的情况下,可以销毁并重新创建活动。但您的异步任务仍将绑定到旧活动

关于这一点有很多线索:

您还可以研究设计用于处理此问题的第三方框架:

谷歌搜索更多信息,这并不是一个详尽的列表。

我提供了两个链接。 首先阅读并试着理解 我希望你将来能解决任何关于Android异步任务的问题

链接1

及 链接2


祝你好运

在某些情况下,只要跨线程正确地访问这些变量,就可以完全访问这些变量。考虑到你问题的细节,我倾向于将变量传递给你的构造函数,但是我认为最好的建议是在你发布相关代码之后。我认为这个问题对你很有用