Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.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
Java Android:从AsyncTask设置变量?_Java_Android_Variables_Android Asynctask - Fatal编程技术网

Java Android:从AsyncTask设置变量?

Java Android:从AsyncTask设置变量?,java,android,variables,android-asynctask,Java,Android,Variables,Android Asynctask,例如,我有以下课程: public class MyClass{ private static int x; private AsyncWorker worker; public void myVoid(){ worker = new Worker; worker.execute(); if (x == null){ Log.v("Say something: ", "x is null"); } } class

例如,我有以下课程:

public class MyClass{

  private static int x;
  private AsyncWorker worker;


  public void myVoid(){
     worker = new Worker;
     worker.execute();
     if (x == null){
         Log.v("Say something: ", "x is null");
     }
  }


class AsyncWorker extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub

            x = 10;

            return null;
        }

        @Override
        protected void onPostExecute(Void result){
            super.onPostExecute(result);

        }
}
公共类MyClass{
私有静态int x;
私人工人;
public void myVoid(){
工人=新工人;
worker.execute();
如果(x==null){
Log.v(“说点什么:”,“x是空的”);
}
}
类AsyncWorker扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…arg0){
//TODO自动生成的方法存根
x=10;
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
}
}
}


结果显示,
x
为空。有没有办法从
AsyncTask
更改
x
并在将来使用它的值?

您需要了解线程和AsyncTask的用户。当您在AsyncTask上调用execute时,myVoid将直接进入下一行,因为AsyncTask正在另一个线程上运行,所以x将始终为null,因为AsyncTask尚未执行任何操作。这里还介绍了有关交叉线程和变量同步的问题


以最好的方式,我建议您记下这个问题,找到一个关于AsyncTask和线程使用的不错的教程

这可能是因为您现在使用的是另一个独立于主线程的线程。因此,
x==null
检查将在
task.execute()
之后立即执行,我已经为Android编程了一段时间,实际上我发现这个问题很有帮助。我已经阅读了很多AsyncTask教程,但没有多少涉及到访问外部变量的问题。请把它放在身边!:-)@David除外,关于线程的任何教程都会解释OP在从单独的线程访问外部变量时的错误,但会立即检查原始线程中的更改。至于从AsyncTask传回结果,最好的方法是创建一个结果侦听器,并以这种方式发回变量。您可以使用类的构造函数将变量传递到AsyncTask中,这在AsyncTask变得更大时尤为重要,因为这样您就不希望它作为内部私有类,而是一个单独的类,因此无法像上面那样访问它