【问题标题】:ProgressDialog in a separate threadProgressDialog 在一个单独的线程中
【发布时间】:2013-07-18 16:21:48
【问题描述】:

我有一个从数据库中提取数据并将其填充到列表中的过程。我想在执行查询时显示进度对话框,但它仅在执行查询后才可视化。我相信我必须在单独的线程中运行ProgressDialog,但遵循了一些建议并且无法使其工作。

所以在我的Activity 中我只有

private void DisplayAllproductListView(String SqlStatement) {           
     ProgressDialog dialog = 
     ProgressDialog.show(MyActivity.context, "Loading", "Please wait...", true);
     //..................
     //..................
     //execute sql query here
     dialog.dismiss();
   }

谢谢

【问题讨论】:

  • 单独的线程!。在 onPreExecute 中使用 asynctask 显示进度对话框并在 onPostExecute 中将其关闭。
  • 尝试使用异步任务

标签: android multithreading progressdialog


【解决方案1】:

1.在主线程中显示你的进程对话框

2.启动一个新线程(如线程A)来处理你的繁重工作

3.完成后,使用处理程序将消息从线程A发送到主线程,后者关闭进程对话框

这样的代码 私有 ProcessDialog pd;

private void startDialog()
{

 pd = ProgressDialog.show(MainActivity.this, "title", "loading");  

     //start a new thread to process job
     new Thread(new Runnable() {  
         @Override  
         public void run() {  
             //heavy job here
             //send message to main thread
             handler.sendEmptyMessage(0); 
          }  
      }).start(); 
}

Handler handler = new Handler() {  
    @Override  
    public void handleMessage(Message msg) {
        pd.dismiss(); 
    }  
};

【讨论】:

  • 非常感谢您的解决方案。我认为它工作得很好,只是它对我来说崩溃了。问题是我的“繁重工作”包括查询、自定义数据适配器和映射到列表视图。你认为这可能是问题吗?我应该只在新的胎面中进行查询吗??
【解决方案2】:

试试这样的:

private class MyAwesomeAsyncTask extends AsyncTask<Void, Void, Void> {

    private ProgressDialog mProgress;

    @Override
    protected void onPreExecute() {
        //Create progress dialog here and show it
    }

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

        // Execute query here

        return null;

    }  

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        //update your listView adapter here
        //Dismiss your dialog

    }

}

称呼它:

new MyAwesomeAsyncTask().execute(); 

【讨论】:

  • 非常感谢您的解决方案。我认为它工作得很好,只是它对我来说崩溃了。问题是我的“繁重工作”包括查询、自定义数据适配器和映射到列表视图。你认为这可能是问题吗?我应该只在异步任务中进行查询吗??
  • 尝试将适配器和listview更新的代码放在onPostExecute方法中。您无法通过 doInBackground 方法操作 UI 线程,因为它在后台运行 :)
  • 再次感谢。自定义列表的查询和准备在 doInBackground 中工作得最好。如何将对象 CustomListDataAdaptor 从 doInBackground 传递到 onPostExecute?语法是什么?谢谢一百万
  • 由于 asynctask 应该是主类的内部类,只需将 CustomListDataAdapter 声明为主类的字段即可。
  • 刚刚想通了。多谢!!!!最后一个如何将字符串(我的 sql 查询)作为参数传递给 doInbackground?
【解决方案3】:

您需要做的就是告诉 Android 在主 UI 线程上运行它。无需创建 Handler。

runOnUiThread(new Runnable() {
    public void run() {
        progressDialog.dismiss();
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多