2013-07-18 74 views
1

我有一个从数据库中提取数据并将其填充到列表的过程。我希望在执行查询时显示进度对话框,但只有在执行查询后才会显示。我相信我必须在一个单独的线程中运行ProgressDialog,但接下来有几条建议并且无法使其工作。ProgressDialog在一个单独的线程

所以在我Activity我只是

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

感谢

+3

sepearate thread !.在'onPreExecute'中使用asynctask显示进度对话框并在'onPostExecute'中关闭它。 – Raghunandan

+0

尝试使用AsyncTask – Joel

回答

10

1.show您处理dialo克主线程

2.启动一个新的线程(如线程A)处理您的沉重工作

3.当完成后,使用处理器从线程A将消息发送到主线程,后者驳回进程对话框

这样的代码 private 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(); 
    } 
}; 
+0

非常感谢您的解决方案。我认为这是完美的工作,除了它为我崩溃。问题是我的“繁重工作”包括查询,自定义数据适配器和映射到列表视图。你认为这可能是问题?我应该只是在一个新的步伐查询? – Alex

+0

你可以在线程中做任何事情。 – kvh

+0

并记住,您只能在主线程中处理ui。 – kvh

3

尝试是这样的:

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(); 
+0

非常感谢您的解决方案。我认为这是完美的工作,除了它为我崩溃。问题是我的“繁重工作”包括查询,自定义数据适配器和映射到列表视图。你认为这可能是问题?我应该只在异步任务中查询吗? – Alex

+0

尝试将适配器和listview更新的代码放在onPostExecute方法中。你不能操作doInBackground方法中的UI线程,因为它在后台运行:) –

+0

再次感谢。自定义列表的查询和准备工作在doInBackground中是最好的。我怎么能将一个对象CustomListDataAdaptor从doInBackground传递给onPostExecute?语法是什么?感谢百万 – Alex

0

所有你需要做的,就是告诉安卓的主UI线程上运行它。无需创建处理程序。

runOnUiThread(new Runnable() { 
    public void run() { 
     progressDialog.dismiss(); 
    } 
}); 
相关问题