如何通过Activity类和普通类从AsyncTask中获取正确的值?

时间:2015-04-19 08:44:12

标签: android android-asynctask android-alertdialog

我有3个简化的课程如下:

Main.java

public class Main extends Activity implements SomeTask.OnAsyncRequestComplete {
    SomeTask someTask;
    String someString = ""; //checkpoint 1

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new SomeDialog(this);
    }

    @Override
    public void asyncResponseSomeTask(String response) {
        someString = someTask.someString; //checkpoint 4
    }
}

SomeDialog.java

public class SomeDialog {
    public SomeDialog(Context context){
        SomeTask someTask = new SomeTask(context);
        someTask.execute("");
    }
}

SomeTask.java

public class SomeTask extends AsyncTask<String, Integer, String> {
    String someString;
    OnAsyncRequestComplete caller;
    Context context;

    public SomeTask(Context a) {    
        caller = (OnAsyncRequestComplete) a;
        context = a;
    }

    public String doInBackground(String... urls) {
        doSomething();
        return "";
    }

    private void doSomething() {
        //does some stuff here and gets value from a webpage
        someString = "some string"; //checkpoint 2
    }

    public void onPostExecute(String response) {
        //checkpoint 3
        caller.asyncResponseSomeTask(response);
    }
}

如您所见,Main调用SomeDialog并传递其上下文。 SomeDialog调用并执行SomeTask,其onPostExecute将返回Main

我有兴趣将someString的{​​{1}}的值恢复为SomeTask

检查Main沿其检查点的值,我发现:

  • 检查点1:someString为空(&#34;&#34;)

  • 检查点2:someString不为空(&#34;某些字符串&#34;)

  • 检查点3:someString不为空(&#34;某些字符串&#34;)

  • 检查站4:someString为空(&#34;&#34;)

因此,在我看来,someString正在完美地完成其工作(与网页通信并获取正确的数据)。在SomeTask中,它甚至具有正确的价值。然而,当onPostExecute调用其Main方法并且值丢失时,会发生一些事情。也许asyncResponseSomeTask在等待Main完成之前还没等完?但如果是这种情况,那么我会在2或3之前得到检查点4的值(因为与网站沟通确实需要一些时间),我不会发现这种情况。

我的问题是:如何在SomeTask中获得someString正确的值?

我对从Main(而不是SomeTask)拨打Main并不特别感兴趣。我知道这样做确实有效并产生了正确的结果,但我想知道如何以这种方式做到这一点。

1 个答案:

答案 0 :(得分:0)

您将获得空字符串,因为您从doInBackground()返回空字符串,该字符串作为onPostExecute()的输入并最终返回回调asyncResponseSomeTask()

  

如何在Main中获得someString的正确值?

public String doInBackground(String... urls) {
    return doSomething();
}

private String doSomething() {
    //does some stuff here and gets value from a webpage
    someString = "some string"; //checkpoint 2
    return someString;
}