1

在我的活动中,我从数据库加载列表的内容,并希望在加载时显示 ProgressDialog。
我自己都在工作,但是如果我在线程中加载数据(我应该这样做吗?),列表会在加载数据之前显示。但如果我使用加入,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

4 回答 4

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();
于 2013-07-08T13:32:02.723 回答
1

你似乎错过了一个线程的重点。线程与您的应用程序同时发生。所以你的应用程序不会调用 start 然后等待线程结束 - 如果它这样做了你可以只使用一个函数。相反,您的代码会继续运行。因此,如果您只是立即调用 join,则您什么也做不了。您可以通过这种方式绕过 NetworkOnMainThreadException,但您仍然会阻止 UI 线程,从而使您的应用程序完全无响应(因此不会显示对话框),并且当看门狗计时器杀死您时,您最终会崩溃.

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

于 2013-07-08T13:31:48.100 回答
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();
于 2013-07-08T13:48:25.197 回答
1

AsyncTask您实际上应该使用。

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

1) onPreExecute()= 显示ProgressDialog

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

3) onPostExecute()= 解雇ProgressDialog

也是一个很好的教程。

一般来说:

@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();
    }
}
于 2013-07-08T13:33:23.910 回答