2012-04-12 2 views
0

Ich entwickle eine Android 3.1 und höher Anwendung.Zeigen Sie ein Dialogfeld in einem Thread, dass es nicht GUI-Thread ist

Ich habe einen Thread hinzugefügt, um eine REST-Anfrage mit Spring Framework zu machen. Dies ist mein Code:

catch (Exception e) 
{ 
    e.printStackTrace(); 
    //display = e.getLocalizedMessage(); 
} 

Ich habe gedacht display Variable setzen es ein Fehler ist, und überprüfen Sie es dann in runOnUiThread(new Runnable():

public class FormsListActivity extends ListActivity 
{ 
    private List<Form> forms; 
    private ProgressDialog progressDialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     progressDialog = ProgressDialog.show(this, "Please Wait.", "Loading forms..."); 
     getUpdates.start(); 
    } 

    private Thread getUpdates = new Thread() 
    { 
     public void run() 
     { 
      try 
      { 
       forms = FormSpringController.LoadAll(); 
       progressDialog.dismiss(); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
       //display = e.getLocalizedMessage(); 
      } 

      runOnUiThread(new Runnable() 
      { 
       public void run() 
       { 
        setListAdapter(new FormAdapter(FormsListActivity.this, R.layout.form_list_item, forms)); 

        ListView lv = getListView(); 
        lv.setTextFilterEnabled(true); 
       } 
      }); 
     } 
    }; 
} 

ich einen Dialog innerhalb catch-Block angezeigt werden soll. Wenn die Anzeige einen Wert hat, zeigen Sie einen Dialog an.

Was denken Sie? Gibt es einen besseren Ansatz?

+0

Sie können UI nicht aktualisieren oder AlertDialog vom normalen Thread anzeigen. Sie müssen UI Threa verwenden, um dies zu tun – Ravi1187342

Antwort

2

überprüfen Sie dies. setzen alle Code Ihres Threads run-Methode innerhalb handleMessage(Message message) Methode

private Handler handler = new Handler(){ 
     public void handleMessage(Message message){ 
      try 
      { 
       forms = FormSpringController.LoadAll(); 
       progressDialog.dismiss(); 
       setListAdapter(new FormAdapter(FormsListActivity.this, R.layout.form_list_item, forms)); 

       ListView lv = getListView(); 
       lv.setTextFilterEnabled(true); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
       //display = e.getLocalizedMessage(); 
      } 

     } 
    } 

und nennen dies in Ihrem Thread run-Methode

handler .sendEmptyMessage(0); 
0
runOnUiThread(new Runnable(){ 
public void run(){ 
////code for alert dialog 
} 
}); 

nicht recommened, aber Sie können es verwenden. Es ist besser, mit einem anderen Thread zu gehen, der alle UI-Aufgaben erledigt.

+0

Danke für Ihre Antwort. Können Sie mir sagen, wo ich einen Beispielcode über "Thread, der alle UI-Aufgaben behandelt" finden kann? Danke, – VansFannel

+0

warum verwenden Sie getUpdates thread? –

+0

weil 'FormSpringController.LoadAll()' ist eine REST GET Anfrage (und ich denke, es ist ein synchroner Aufruf). Sie können 'FormSpringController.LoadAll()' Quellcode hier sehen http://StackOverflow.com/Questions/10073290/erwartete-Beginn-Array-But-was-Beginn-Objekt-mit-Anarray-der-Three-Elemente – VansFannel

Verwandte Themen