Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 异步任务新手问题_Java_Android_Class_Android Asynctask - Fatal编程技术网

Java 异步任务新手问题

Java 异步任务新手问题,java,android,class,android-asynctask,Java,Android,Class,Android Asynctask,我不明白为什么变量“vysledek”在从活动调用void“Send”后保持不变。我可能不完全理解异步任务的工作方式。谢谢你的帮助 public class Tools{ public String vysledek; public void Send() { Poslat Poslat = new Poslat(); Poslat.execute(); } private class Poslat extends AsyncTask<String

我不明白为什么变量“vysledek”在从活动调用void“Send”后保持不变。我可能不完全理解异步任务的工作方式。谢谢你的帮助

public class Tools{

   public String vysledek;

 public void Send() {
       Poslat Poslat = new Poslat();
       Poslat.execute();
}

private class Poslat extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {

            vysledek = "something I want it to be";
     }

@Override
protected void onPostExecute(String result){
    vysledek = "something I want it to be 2";
}

但这会导致崩溃。

定时。asnc任务发生在另一个线程上。但是,当操作系统切换到该线程时,由操作系统决定。它应该很快发生(接下来的几百毫秒),但它不一定是立即发生的,所以如果你立即检查它,你可能会或不会看到它发生了变化。正确放置需要异步任务运行的代码的位置是onPostExecute。

您应该在异步任务完成后分配它

public class Tools{

   public String vysledek;

 public void Send() {
       Poslat Poslat = new Poslat();
       Poslat.execute(vysledek);
}

private class Poslat extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {


     }

     @Override
     protected void onPostExecute(String result){
     vysledek = "I should be here";
     }
}
公共类工具{
公共字符串vysledek;
公共无效发送(){
Poslat Poslat=新的Poslat();
Poslat.execute(vysledek);
}
私有类Poslat扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
}
@凌驾
受保护的void onPostExecute(字符串结果){
vysledek=“我应该在这里”;
}
}

在调用“Send()”的活动中,您试图在哪里访问vysledek?这会导致崩溃,因为vysledek在AsyncTask完成之前是空的。查看@cadocx answer以了解正确的访问方法。我这样更改了它,但我需要活动等待,我不知道如何操作。最好在异步任务完成时调用equals(“.”equals(Tools.vysledek))以避免空指针异常。但是有没有办法让活动等待它完成?这违背了异步执行的目的。将所有需要它的代码放在onPostExecute()中我想取消它。我这样做只是为了访问HttpClient;)无论如何都要在PostExecute上执行。如果你不这样做,你的整个UI将冻结并且没有响应,看起来你的应用程序坏了。用户将不知道发生了什么。
public class Tools{

   public String vysledek;

 public void Send() {
       Poslat Poslat = new Poslat();
       Poslat.execute(vysledek);
}

private class Poslat extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {


     }

     @Override
     protected void onPostExecute(String result){
     vysledek = "I should be here";
     }
}