2010-07-27 48 views
1

我有一个小问题,我希望你能帮助我。)ProgressDialog在线程工作在Android

麻烦的是,这ProgressDialog只显示加载的run()之后,但我需要证明它在启动和显示它在加载一些数据时。我把:“dialog = ProgressDialog.show(CategoriesListActivity.this,”工作...“,”加载数据“,真);”在run()方法中,但是相同。我在Log.i()中打印一些信息(int i ++)并放置ProgressDialog的标题。方法正常工作,但不显示ProgressDialog。我已经阅读了一些信息,说明某个线程阻塞了另一个线程(我创建的),这就是为什么不显示progressDialog,但无法执行任何操作。谢谢。

public void run() { 

     /** getting there long execution **/ 
     handler.sendEmptyMessage(0); 

    } 

    private Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 

      // stop and hide dialog 
      dialog.dismiss(); 
     } 
    }; 

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

     dialog = ProgressDialog.show(CategoriesListActivity.this, "Working...", 
       "Loading data", true); 

     // start new thread where get long time execution 
     Thread thread = new Thread(this); 
     thread.start(); 

     //wait while data is loading, 'cause I need use variable from calculation 
       // in "EfficientAdapter" later 
     try { 
      thread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     ListView l1 = (ListView) findViewById(R.id.list); 
     l1.setAdapter(new EfficientAdapter(this)); 
    } 

回答

1

这与AsyncTask帮助(智能底色线程)和ProgressDialog

时候做的AsyncTask开始,我们提出一个progressdialog与不确定状态,一旦任务完成后,我们关闭对话框。

示例代码
什么适配器确实在这个例子就明白了,你需要使用的AsyncTask以显示该进程的对话框并不重要,更重要的。

private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { 
    ProgressDialog dialog; 
    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(viewContacts.this); 
     dialog.setMessage(getString(R.string.please_wait_while_loading)); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 
    /* (non-Javadoc) 
    * @see android.os.AsyncTask#doInBackground(Params[]) 
    */ 
    @Override 
    protected ContactsListCursorAdapter doInBackground(Void... params) { 
     cur1 = objItem.getContacts(); 
     startManagingCursor(cur1); 

     adapter1 = new ContactsListCursorAdapter (viewContacts.this, 
       R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); 

     return adapter1; 
    } 

    protected void onPostExecute(ContactsListCursorAdapter result) { 
     list.setAdapter(result); 
     dialog.dismiss(); 
    } 
}