2012-08-17 88 views
4

我完全利用我的AsyncTask嗎?有人可以糾正我的代碼,如果它是錯誤的。我只是想確保我的AsyncTask能夠正常工作,所以我不會在將來遇到任何麻煩。我希望爲我的所有課程使用AsyncTask。這是一個好習慣嗎?Android AsyncTask

public class SingleMenuItemActivity extends Activity { 

    // XML node keys 
static final String KEY_TITLE = "title"; 
static final String KEY_ARTIST = "artist"; 
static final String KEY_THUMB_URL = "thumb_url"; 
private ProgressDialog pDialog; 
String title; 
String artist; 
String image_url; 
ImageView view; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.single_list_item); 
     new loadSingleView().execute(); 


     view = (ImageView) findViewById(R.id.single_image); 
    } 


public class loadSingleView extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(
        SingleMenuItemActivity.this); 
      pDialog.setMessage("Connecting to Server ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 
     @Override 
     protected String doInBackground(String... args) { 
      // updating UI from Background Thread 


      Intent in = getIntent(); 

      image_url = in.getStringExtra(KEY_THUMB_URL); 
         title = in.getStringExtra(KEY_TITLE); 
      artist = in.getStringExtra(KEY_ARTIST); 


      return null; 

        } 
     @Override  
     protected void onPostExecute(String args) { 
      // dismiss the dialog after getting all products 

      ImageLoader imgLoader = new ImageLoader(getApplicationContext()); 

      imgLoader.DisplayImage(image_url, view); 

      TextView lblName = (TextView) findViewById(R.id.name_title); 
      TextView lblCost = (TextView) findViewById(R.id.name_artist); 

      lblName.setText(title); 
      lblCost.setText(artist); 
      pDialog.dismiss(); 
     } 
} 

回答

3

您必須從方法onPostExecute()更新UI。我喜歡將我的任務移動到他們自己的文件中。通過這種方式,我們可以分離關注點,從而更容易理解代碼。我們可以通過使用一個接口來定義一個回調方法做到這一點

public class LoadSingleView extends AsyncTask<String, String, String> { 

    public interface LoadSingleViewHandler { 
     void onSingleViewLoad(String result); 
    } 

    private LoadSingleViewHandler handler; 

    public LoadSingleView(LoadSingleViewHandler handler) { 
     this.handler = handler; 
    } 

    @Override 
    protected String doInBackground(String... args) { 
     // Do operation here and return the result 
     // Operation is usually some network request 
     // or something that will take alot of time 
    } 

    @Override  
    protected void onPostExecute(String result) { 
     handler.onSingleViewLoad(result); 
    } 
} 

現在剛剛開始從活動的任務,並將活動實現LoadSingleViewHandler接口。

4

你不能從Backgroud線程更新UI。例如使用doInBackground()擺脫server.All數據這一過程將在Background.And onPostExecute做的是更新後的用戶界面的後臺進程結束

For more info Study here

Example1

Example2

您可以在Google中找到更多內容:)

+0

我剛剛修改我的代碼。現在應該是正確的。 – 2012-08-17 15:39:16

+0

感謝您的建議 – user1387035 2012-08-21 13:50:17

0

是的,所有UI操作都必須在主線程,句點上完成。您可以下載要在doInBackground()中顯示的圖像,並更新onPostExecute()中的整個UI。

此外,將AsyncTask從您的活動中移出是一種很好的做法。這是一個更多的工作,但隨着應用程序變得更大,更復雜,它會讓你的生活更輕鬆。您可以使用處理程序將數據從AsyncTask傳遞到您的活動。

0

後臺執行必須主要用於那些不能在UI線程上執行的任務,因此請使用它連接到服務器(API)以接收和發送數據。 不使用它沒有必要...