2010-07-27 5 views
1

J'ai un petit problème, je l'espère U peut me aider;)ProgressDialog travaillant en fil sur android

Le problème est que ProgressDialog afficher uniquement après le chargement run(), mais je dois le montrer sur le début et de montrer tout en chargeant des données. Je mets: "dialog = ProgressDialog.show (CategoriesListActivity.this," Travailler ... "," Chargement des données ", true);" dans la méthode run(), mais la même chose. J'imprime dans Log.i() quelques infos (int i ++) et mets le titre de ProgressDialog. La méthode fonctionne correctement, mais n'affiche pas ProgressDialog. J'ai lu quelques infos qu'un thread bloque un autre thread (mon créé), c'est pourquoi n'affiche pas progressDialog, mais ne peut rien faire. THX.

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)); 
    } 

Répondre

1

Cela se fait avec l'aide de AsyncTask (un fil backround intelligent) et ProgressDialog

Lorsque le AsyncTask commence nous élevons un ProgressDialog avec état indéterminé, une fois que la tâche est terminée, nous écartons la boîte de dialogue.

Exemple Code
Qu'est-ce que l'adaptateur fait dans cet exemple est pas important, plus important de comprendre que vous devez utiliser AsyncTask pour afficher une boîte de dialogue pour le progrès.

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(); 
    } 
} 
Questions connexes