在等待连接的线程时显示ProgressDialog

时间:2013-07-08 13:22:15

标签: android multithreading progressdialog

在我的活动中,我从数据库加载列表的内容,并希望在加载时显示ProgressDialog。
我已经完成了它自己的工作,但是如果我在一个线程中加载数据(我应该这样做?),列表会在加载数据之前显示。但如果我使用join,则ProgressDialog甚至不会出现。

我该如何结合这个?或者这对线程来说根本不可能? (也许AsyncTask?)

以下是参考代码:

    final ProgressDialog progressD=ProgressDialog.show(ShopSwitchActivity.this, "", "Loading..", true);

    Thread myThread = new Thread(new Runnable() {  
        @Override
        public void run() {
          try
          {
              getData();
          }catch(Exception e){}
        }
    });
    myThread.start();

    try {
            myThread.join();
    } catch (InterruptedException e) {
    }
    progressD.dismiss();

编辑:使用AsyncTask更新代码:

public class LoadList extends AsyncTask<String, Void, Boolean> {

    ProgressDialog dialog;
    ShopSwitchActivity activity;

    public LoadList(ShopSwitchActivity activity) {
        this.activity = activity;
        dialog = new ProgressDialog(activity);
    }

    protected void onPreExecute() {
        this.dialog.setMessage("Loading...");
        this.dialog.show();
    }

        @Override
    protected void onPostExecute(final Boolean success) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }

    protected Boolean doInBackground(final String... args) {
        try{
       activity.getData();
        } catch (Exception e) {
            Log.e("error", e.getMessage());
        }
       return true;
    }
}

编辑:我的解决方案 现在使用AsyncTask加载数据,完成后,我用新数据刷新列表。

4 个答案:

答案 0 :(得分:4)

您可以使用AsyncTask执行此操作。在主类中编写要执行操作的AsyncTask类。您可以在异步类的preexcecute中创建进度对话框,并在异步类的onpostexecute中关闭。以下是您将如何做到这一点:

  class MyAsync extends AsyncTask<String, Void, Void> {
     ProgressDialog pd;
     Context co;
     MyActivity ma;

     public MyAsync (MyActivity ma){
         this.ma= ma;
         this.co = ma;
         pd= new ProgressDialog(co);
     }

     @Override
     protected void onPreExecute() {
         this.pd.show();

     super.onPreExecute();
     }
            @Override
            protected Void doInBackground(String... params) {
                // do your database operations here
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                // show db results and dismiss progress dialog pd.dismiss();
                super.onPostExecute(result);
            }
        }
在MyActivity中调用:

MyActivity ma = this;
new MyAsync(ma).execute();

答案 1 :(得分:1)

你好像错过了一个主题。线程与应用程序同时发生。所以你的应用程序不会调用start然后等待线程结束 - 如果它确实你只能使用一个函数。而是您的代码继续运行。因此,如果您只是立即致电加入,那么您就没有做任何事情。你会以这种方式解决NetworkOnMainThreadException问题,但你仍然会阻止UI线程使你的应用程序完全没有响应(因此没有显示对话框),当看门狗计时器杀死你时你最终会崩溃

相反,处理此问题的最佳方法是使用AsyncTask。在doInBackground()中调用getData。然后在onPostExecute中关闭对话框。

答案 2 :(得分:1)

您应该实际使用AsyncTask

Here是图书馆的链接。这很简单:

1)onPreExecute() =显示ProgressDialog

2)doInBackground() =执行你的代码

3)onPostExecute() =解雇ProgressDialog

Here也是一个不错的教程。

一般来说:

@Override
protected void onPreExecute() {
    dialog = new ProgressDialog(this.context);
    dialog.setMessage("Loading...");
    dialog.setCanceledOnTouchOutside(false);
}

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

答案 3 :(得分:1)

private Thread myThread;
private ProgressDialog mProgDialog;

mProgDialog = ProgressDialog.show(ShopSwitchActivity.this,"","Laden..", true);

myThread= new Thread(new Runnable() 
{
    public void run() 
    {
    myThread.setPriority(Thread.MIN_PRIORITY);

    try
    {
        getData();
    }catch(Exception e){}

    runOnUiThread(new Runnable() 
    {
        public void run() 
        {
        if (mProgDialog != null&& mProgDialog.isShowing())
        mProgDialog.dismiss();
        }                                                                               }
    });

    }
});
myThread.start();