显示ProgressDialog,检索数据和等待它

时间:2011-05-05 18:36:50

标签: java android

我正在编写一个应用程序,在许多点上将尝试从网站检索帐户信息。我想编写一个函数(“getAccount()”)来执行以下操作:

  1. 显示ProgressDialog
  2. 拨打网站
  3. 等待回复
  4. 清除ProgressDialog
  5. 完成前四个步骤后,将控制权返回给调用函数
  6. 从页面获取数据我没有问题;我遇到的问题是整个“显示对话框/等待完成/返回控制到调用函数”部分。 ProgressDialog根本不显示,或者函数在从站点发出数据请求后立即返回给调用者,而没有给它足够的时间来检索数据。

    非常感谢任何帮助。

    编辑:我在下面添加了一些代码,用于我对AsyncTask的处理。请注意,我在grabURL()中有一行MsgBox("done");这只是一个Toast电话。当我运行此代码时,在仍然发出HTTP请求时会弹出“done”。此MsgBox行仅存在,因此我可以看到grabURL是否正在等待GrabURL完成(不是这样)。

    public void grabURL() {
       new GrabURL().execute();
       MsgBox("done");
    }
    
    private class GrabURL extends AsyncTask<String, Void, Void> {
       private ProgressDialog Dialog = new ProgressDialog(MyContext);
    
       protected void onPreExecute() {
           Dialog.setTitle("Retrieving Account");
           Dialog.setMessage("We're retrieving your account information. Please wait...");
           Dialog.show();
       }
    
       protected Void doInBackground(String... urls) {
           try {
               // Get account info from the website
               String resp = GetPage(ThePage); // I have this classed out elsewhere
               // Some other code that massages the data
               AccountRetrievalSuccess = true;
           } catch (Exception e) {
               AccountRetrievalSuccess = false;
           }
    
           return null;
       }
    
       protected void onPostExecute(Void unused) {
           Dialog.dismiss();
       }
    
    }
    

3 个答案:

答案 0 :(得分:1)

出现消息框,因为AsyncTask正在使用单独的线程来运行doInBackground。执行调用不会阻塞。您可以在调用dismiss之后将消息框移至onPostExecute。小费。您可能希望在onPause中调用progress.cancel,否则您可能会在方向更改时遇到不需要的行为。最后,如果要在doInBackground中检索信息,请考虑在doInBackground中返回信息。信息将传递给onPostExecute。因此,如果信息是对象MyInfo,请考虑:

private class GrabURL extends AsyncTask<String, Void, MyInfo> {

答案 1 :(得分:0)

在没有看到某些代码的情况下无法肯定地说,但是当你想要同步调用(它将阻止并等待返回数据)到网站时,听起来你正在对网站进行异步调用。

答案 2 :(得分:0)

您想使用AsyncTask,在onPreExecute中生成非用户可取消的ProgressDialog,在doInBackground中执行您的工作,并在onPostExecute中将其关闭。

这样的事情:

public class MyApp extends Activity
{

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // blah blah blah

    URL url;
    try
    {
      url = new URL("http://example.com");
      new MyTask().execute(url);
    }
    catch (MalformedURLException e)
    {
    }

  }

  protected void doSomeStuff()
  {
    // stuff to do after the asynctask is done
  }


  protected void throwAWobbly()
  {
    // stuff to do if you didn't get the data
  }

  // inner class to do the data getting off the UI thread,
  // so android doesn't "not responding" kill you
  private class MyTask extends AsyncTask<URL, Void, Boolean>
  {
    private ProgressDialog dialog;
    private boolean gotData = false;

    protected void onPreExecute()
    {
      // create a progress dialog
      dialog = ProgressDialog.show(MyApp.this, "",
                "Doing stuff. Please wait...", false, false);
    }

    protected Boolean doInBackground(URL... urls)
    {
       // get your data in here!
       return gotData;
    }

    protected void onPostExecute(Boolean result)
    {
       // get rid of the progress dialog
       dialog.dismiss();

       if (true == result)
       {
         // got all data!
         doSomeStuff();
       }
       else
       {
         // oops!
         throwAWobbly();
       }
    }
  }

}