2013-08-01 50 views
1

我有顯示進度對話框......和我執行3只HTTP請求一個單獨的線程的方法...更新進度從線程之外對話框

這裏是代碼...

public void downloadData(View v) 
{ 
    final ProgressDialog prog; 

    try 
    { 
     // setup progress dialog 
     prog = new ProgressDialog(this); 
     prog.setTitle("Downloading Data"); 
     prog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     prog.setIcon(R.drawable.firstdroidicon); 
     prog.setCanceledOnTouchOutside(false); 
     prog.setCancelable(false); 
     prog.show(); 


     Thread syncThread = new Thread(); 
     syncThread = new Thread() 
     { 
      public void run() 
      { 
       String result = ""; 
       String URL = //url for ReST service 
       String urlParams = ""; 

       GetByREST gbr = new GetByREST(); 

       // run the customer search 
       prog.setMessage("Fetching Customers");//update progress dialog 
       result = //execute first post 

       // run the contact search 
       prog.setMessage("Fetching Contacts");//update progress dialog 
       result = //execute second post 

       // run the item saved search 
       prog.setMessage("Fetching Items");//update progress dialog 
       result = //execute third post 

       prog.dismiss(); 
     }; 
     syncThread.start(); 
    } 
    catch (Exception e) 
    { 
     messageBox("downloadData", e.getMessage()); 
    } 
} 

如何在每次請求前更新進度對話框消息?

回答

2

你需要用線程到UI功能的任何電話中runOnUIThread調用。 runOnUIThread需要一個可運行的,並在可用時在UI線程上執行它。這解決了只能在UI線程上更新UI的限制。

+0

我試過這個,它工作正常。然而,對每個請求執行此操作可能會使代碼顯得雜亂無章。 –

+1

最簡單的方法是不要使用一個匿名類 - 把runnable的代碼放在其他地方,只是在線程runnable中通過new創建它。實際上,因爲所有3個都設置了不同的字符串,所以你可以讓它們成爲一個接受字符串參數的類。 –

1

從後臺線程更新UI。您可以使用

  1. 處理程序:http://developer.android.com/reference/android/os/Handler.html
  2. 的AsyncTask:http://developer.android.com/reference/android/os/AsyncTask.html

在你的情況,你應該AsyncTask基本上照顧了網doInBackground()方法調用和onPostExecute()方法更新進度對話框

+0

我對AsyncTask瞭解不多。實施起來很容易嗎? –

+1

有很多教程可用。它更好地使用它。背景線程將僅由AsyncTask負責。 http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html –