【问题标题】:ProgressDialog in AsyncTask onPreExecute, but it appears after doInBackgroundAsyncTask onPreExecute中的ProgressDialog,但它出现在doInBackground之后
【发布时间】:2014-06-26 15:41:25
【问题描述】:

这是我的应用程序的一部分。 (您可以将下面的代码作为一个独立的应用程序运行)在该网站(url)上,使用php语言,从其他网站解析一些数字,并制作一个数组并将其编码为JSON数组,并显示。

但是,使用下面的代码(没有关闭功能!)ProgressDialog 出现在 doInBackground 之后。

当我像下面这样向 onPostExecute 添加解除函数时,它永远不会出现。但是当我为检查对话框窗口设置日志时,它说有一个对话框。

我听说 doInBackground 会冻结 UI,但它会在显示对话框之前冻结。

其他类似问题已经找到解决方案,从 mAsyncTask().execute().get() 中删除 .get(),但我的代码中没有任何 get()。

布尔变量 loadfinish 用于等待完成 asynctask,以在 asynctask 之后显示该网站的结果。如果我删除 while(loadFinish == false) 在那里,它自动出现和消失得很好,但我不能立即显示结果......

添加)我发现在doInBackground之后出现对话框需要几秒钟...为什么?!

Add2) 我曾尝试在new mAsyncTask().execute() 前后移动对话框代码,但它也不起作用...

public class MainActivity extends Activity {

boolean loadFinish;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button start = (Button) findViewById(R.id.start); 
//just a button for starting asynctask
    start.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            loadFinish = false;
            new mAsyncTask().execute(); 
// get and make json array to java array
            while (loadFinish == false)
                ;
        }
    });
// add array to Custom_List_Data, and set custom row_adapter to listView. 
// if I delete while(loadFinish == false), array with initial data is added.
}

private class mAsyncTask extends AsyncTask<String, String, String> {

    ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setMessage("asdf");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
    }

    @Override
    protected String doInBackground(String... params) {

        String url = "http://songdosiyak.url.ph/MouiRate/etoos/3/main/";
        String response_str = "";

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        ResponseHandler<String> responseHandler = new BasicResponseHandler();

        try {
            response_str = client.execute(request, responseHandler);
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        loadFinish = true;
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
                    dialog.dismiss();
    }
}

}

对不起,我的英语语言能力很差,感谢您的阅读!

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:

    正如 Gabe 所说,您不需要循环,您所需要的只是更多地了解异步方法应该做什么。

    您介绍了结果,因为您想显示结果。您所要做的就是在doInBackground 中返回您的response_str。然后它将作为onPostExecute 的参数提供给您,您可以在其中轻松地显示它,或者做任何您需要做的事情。

    总结一下:

    • 删除循环
    • 返回值response_str 或来自doInBackground 的任何值
    • onPostExecute 中显示值
    • 并删除 loadFinish 变量,因为它根本不需要

    希望对您有所帮助。

    【讨论】:

    • 感谢您的回答和总结!!我已经通过删除循环解决了这个问题,并在新的 asyncTack().execute()(将数据添加到 Custom_List_Data)之后插入代码到 onPostExecute! (和你的回答类似)
    【解决方案2】:

    因为您使用的 AsyncTask 完全错误。你正忙着循环等待它完成。永远不要那样做——如果你这样做,那么使用 AsyncTask 是没有意义的。无论如何,它不会出现的原因是 UI 不会更新,直到 UI 线程返回到 Android 框架内的事件循环并运行绘图代码,这发生在 onClick 返回之后。所以在你的繁忙循环退出之前你不会画画,这发生在 doInBackground 完成之后。

    解决方案是在您的 onClick 中删除等待 AsyncTask 完成的循环。如果您有需要在其后运行的逻辑,请将其放入 onPostExecute。

    【讨论】:

      【解决方案3】:

      可能值得研究使用异步库。

      使用库来帮助处理异步回调非常有帮助,因为您可以启动微调器,调用您的 api,然后在 onSuccess 函数或类中的成功回调方法中停止微调器。

      这是我常用的:

      LoopJ's Async HTTP Callback Library

      这将处理 GET 和 POST 请求,具有许多很酷的功能,例如自定义超时、JSON 格式、onSuccess() 和 onFailure() 方法等。这个库也有很多工作示例。我在所有应用中都使用了它,还没有遇到任何问题!

      希望这会有所帮助。

      【讨论】:

      • 感谢您的回答!我已经通过删除循环解决了这个问题,并在new mAsyncTack().execute()(将数据添加到Custom_List_Fata)之后插入代码到onPostExecute!我认为问题出在new mAsyncTask().execute() 之后的循环
      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多