【问题标题】:AsyncTask newbie issueAsyncTask 新手问题
【发布时间】:2014-06-22 20:21:17
【问题描述】:

我无法弄清楚为什么在从活动中调用 void “Send” 后变量“vysledek”保持不变。我可能不完全理解 AsyncTask 的工作方式。感谢您的帮助。

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";
}

}

我希望名为“Send”的 Activity 已经拥有该变量。所以我想它必须等待它完成。我试着像这样等待:

 while (Tools.vysledek.equals(""))
            { }

但这会导致崩溃。

【问题讨论】:

  • 您要在哪里访问 vysledek?
  • 在调用“Send()”的Activity中。
  • 它会导致崩溃,因为 vysledek 在您的 AsyncTask 完成之前为空。查看@cadocx 答案以了解正确的方法
  • 我是这样改的,但我需要 Activity 等待,我不知道怎么做..
  • 最好将等号调用为 while ("".equals(Tools.vysledek)) 以避免空指针异常。

标签: java android class android-asynctask


【解决方案1】:

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

【讨论】:

  • 但是有什么办法可以让Activity等待它完成吗?
  • 这违背了异步执行的目的。将所有需要它的代码放在 onPostExecute()
  • 我想打败它。我这样做只是为了可以访问 HttpClient ;)
  • 无论如何都要在 PostExecute 上执行。如果您不这样做,您的整个 UI 将冻结且无响应,看起来您的应用程序已损坏。用户不会知道发生了什么。
【解决方案2】:

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

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";
     }
}

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 2010-12-08
    • 2011-08-13
    • 2010-12-20
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多