AsyncTask onPreExecute中的ProgressDialog,但它出现在doInBackground之后

时间:2014-06-26 15:41:25

标签: android android-asynctask progressdialog

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

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

当我向onPostExecute添加dismiss函数时,如下所示,它永远不会出现。但是当我设置日志以检查对话框窗口时,它说有一个对话框。

我听说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();
    }
}

}

抱歉我的英语能力差,感谢您的阅读!

3 个答案:

答案 0 :(得分:1)

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

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

总结一下:

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

希望有所帮助。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

这是我经常使用的那个:

<强> LoopJ's Async HTTP Callback Library

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

希望这有帮助。