2011-08-05 39 views
0

可能重複:
Download a file with Android, and showing the progress in a ProgressDialogAndroid:使用「進度」GUI在後臺線程中從網絡加載數據?

我想從一個Web服務器的信息加載到我的應用程序。目前,我正在主線程中執行此操作,我讀過的操作非常糟糕(如果請求花費的時間超過5秒,則應用程序崩潰)。

因此,我想了解如何將此操作移至後臺線程。這是否涉及某種服務?

下面是代碼的樣本,我做服務器的請求:

 // send data 
     URL url = new URL("http://www.myscript.php"); 
     URLConnection conn = url.openConnection(); 
     conn.setDoOutput(true); 
     OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
     wr.write(data); 
     wr.flush(); 

     // Get the response 
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = rd.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 

     wr.close(); 
     rd.close(); 

     String result = sb.toString(); 

     Intent i = new Intent(searchEventActivity.this, searchResultsActivity.class); 
      i.putExtra("result", result); 
     startActivity(i); 

我等待着要建立一個JSON字符串的響應,那麼我傳遞一個字符串到一個新的活動。這是一個及時的操作,而不是懸掛用戶界面,我想向用戶展示某種好的「進度」欄(即使其中一個圓形燈具旋轉燈也亮),而此URL業務正在發生後臺線程。

感謝您的任何幫助或指導教程的鏈接。

+0

[與答案相同的問題(http://stackoverflow.com/questions/3028306/download-a-file-with-android-and-showing-progress-in-a-progressdialog)...已經有數百個(好的,很多)類似/相同的問題。 –

回答

4

該過程的基本思想是創建一個Thread來處理Web請求,然後使用Handler s和Runnable s來管理UI交互。

我在應用程序中管理這種方式的方式是使用包含所有智能和業務規則來管理我的通信的自定義類。它還包含構造函數中的變量以允許調用UI線程。

下面是一個例子:

public class ThreadedRequest 
{ 
    private String url; 
    private Handler mHandler; 
    private Runnable pRunnable; 
    private String data; 
    private int stausCode; 

    public ThreadedRequest(String newUrl, String newData) 
    { 
     url = newUrl; 
     data = newData; 
     mHandler = new Handler(); 
    } 

    public void start(Runnable newRun) 
    { 
     pRunnable = newRun; 
     processRequest.start(); 
    } 

    private Thread processRequest = new Thread() 
    { 
     public void run() 
     { 
      //Do you request here... 
      if (pRunnable == null || mHandler == null) return; 
      mHandler.post(pRunnable); 
     } 
    } 
} 

這會從您的UI線程調用如下:

final ThreadedRequest tReq = new ThreadedRequest(url, maybeData); 
//This method would start the animation/notification that a request is happening 
StartLoading(); 
tReq.start(new Runnable() 
    { 
     public void run() 
     { 
      //This would stop whatever the other method started and let the user know 
      StopLoading(); 
     } 
    });