java - Android的AsyncTask : multiple params,返回值,等待

标签 java android android-asynctask

我研究如何实现 Android 的 AsyncTask 类已经有一段时间了。基本上,我希望它执行经典场景:在进行网络调用时简单地为不确定的加载轮设置动画。然而,在实践中,我在让它按照我想要的方式工作时遇到了一些问题。

我的代码当前看起来像这样:(在我想要的 AsyncTask 实现之前)

 String result = timeConsumingNetworkCall(String someData, ArrayList stuff1);
 doStuff(result);

 String result = timeConsumingNetworkCall(String otherData, ArrayList stuff2);
 doOtherStuff(result);

 String result = timeConsumingNetworkCall(String dataAgain, ArrayList stuff3);
 doYetEvenMore(result);

我希望能够重用我的 AsyncTask 调用来将数据传递给它,它进行网络调用,然后返回我可以按照我的意愿处理的数据,就像我上面所做的那样。

现在 - 这很完美,当然应用程序似乎在没有加载的情况下“挂起”。 AsyncTask 来了。也许我只是还不太“明白” - 但是如何在 AsyncTask 之外返回数据以便 doStuffToUI() 等可以使用它?

最终,如果我可以使用与此类似的 AsyncTask:

String result = new PostToFile("function_name", keysAndValues).execute().getResult();
doStuff(result); // this shouldn't execute until the AsyncTask is done

我这样做对吗?这是应该/可以做到的吗?下面是我的 AsyncTask 类,为简洁起见进行了缩短。

private class PostToFile extends AsyncTask<PostToFile, Void, Void>{
    private String functionName;
    private ArrayList<NameValuePair> postKeyValuePairs;
    private String result = "";

    public PostToFile(String function, ArrayList<NameValuePair> keyValuePairs){
        functionName= function;
        postKeyValuePairs = keyValuePairs;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(BaseActivity.getInstance(), "Loading", "Please wait...", true, false);
    }

    @Override
    protected Void doInBackground(PostToFile... params) {                       
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair(FUNCTION_KEYWORD, functionName));
        for (int i = 0; i < postKeyValuePairs.size(); i++)            {
            nameValuePairs.add(postKeyValuePairs.get(i));
        }

        try{
            // ***do the POST magic.***
            result = response.toString();
        }
        catch (Exception e){
             // clean up my mess
        }

        return null;
    }

    private String getResult(){
        return result; // can I use this somehow???
    }

    @Override
    protected void onPostExecute(Void result) {
        progressDialog.dismiss();
    }
 }

感谢任何帮助,提前非常感谢。如果需要的话,我很乐意进行澄清。

最佳答案

doStuff(result); this shouldn't execute until the AsyncTask is done

那么您将需要使用AsyncTask.get()如果需要,则等待计算完成,然后检索其结果。

因为调用 AsyncTask.get() 会卡住主 UI 线程,直到 doInBackground 执行未完成,所以您需要使用 Thread 来避免卡住 UI 和 >runOnUiThread 用于在 AsyncTask 执行完成后更新 Ui 元素。

示例:-

public void  ThreaddoStuff(){

 Thread th=new Thread(){
    @Override
    public void run(){
      // start AsyncTask exection here
      String result = new PostToFile("function_name", 
                      keysAndValues).execute().get().getResult();

     // now call doStuff by passing result
     doStuff(result);
    }
  };
th.start();
}

关于java - Android的AsyncTask : multiple params,返回值,等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15153919/

相关文章:

android - 在 GridView 中使用 setGravity()

java - android:带有阿拉伯语内容的 webview 不加载自定义字体

java - 什么是 ro.expect.recovery_id?

java - 由于未解析的类型,ApiDemos 3.0/3.1 将无法构建

Java方法表

java - 用 Java 编写多线程映射迭代器

java - Android中如何终止AsyncTask?

java - 提高 Java 的 BigInteger 性能

java - 如何使用单独的 AsyncTask 类连接互联网

android - AsyncTask DoInBackground 下载谷歌电子表格数据返回空值?