2012-10-31 47 views
3

我的工作中,我的看法充氣代碼,當在一個視圖中的用戶點擊,我需要進行解析URL,然後檢查解析返回我。問題是我需要在asynctask解析中執行以避免發生異常,並且在任務結束之前執行檢查。發送視圖作爲參數的AsyncTask

理想的做法是送視圖作爲參數傳遞給的AsyncTask送我的所有代碼到的AsyncTask。但是,並非是如何讓這最後

我把代碼,使其更容易理解。

vMens.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View vMens) { 
     int readOK=0; 
     try{ 
      new taskMensaje(vMens).execute(); 

      if(mess_gest.equals("1")){ 
       readOK=1; 
      }else{ 
       readOK=0; 
      } 
     }catch(Exception e){ 
      Utils.showDialog(Calendario.this, "Error", "No se puede gestionar el mensaje"); 
     } 
      if (readOK==0){ 
       Mess.state = message.get(vMens.getId()).p1; 
       Mess.tittle = message.get(vMens.getId()).p2; 
      else{ 
       //message no gest 
      } 
    } 
}); 
private class taskMensaje extends AsyncTask<String, Void, View> { 

    @Override 
    protected String doInBackground(String... params) { 
     MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest); 
     gestionables = parserMensGest.parse(); 

     mess_gest = gestionables.get(0).p0; 
     return ""; 
    } 
} 

任何想法來解決這個問題呢?

感謝和抱歉,我的英語不好

+0

只是一個提示。首先比較字符串,這是一個很好的做法,就像這個「1」.equals(mess_gest)'。它有助於避免NullPointers。您還可以使用'TextUtils.equals(「1」,mess_gest)'比較字符串。 TextUtils由android SDK提供。 – kaneda

回答

7

你可以把它作爲一個參數的構造器,它存儲的AsyncTask對象。 存儲它作爲一個的WeakReference和http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

private class TaskMensaje extends AsyncTask<String, Void, Void> { 
    private WeakReference vRef; 
    .../your other stuff here 

    public TaskMensaje (View v) { 
     vRef = new WeakReference(v); 
    } 


    @Override 
    protected String doInBackground(String... params) { 
     MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest); 
     gestionables = parserMensGest.parse(); 

     mess_gest = gestionables.get(0).p0; 
     return null; 
    } 

    @Override 
    protected onPostExecute(Void result) { 
     if (vRef != null && bitmap != null) { 
      final ImageView imageView = vRef.get(); 
      if (imageView != null) { 
       // Do whatever you want with your ImageView 
       ... 
      } 
     } 
    } 
} 

檢查它的onPostExecute,很像顯示從官方文檔圖像的最佳實踐BTW,看到的AsyncTask參考文檔來學習如何使用的通用參數類定義;-) 在http://developer.android.com/reference/android/os/AsyncTask.html

+0

我必須投射參考文獻: 'final ImageView imageView =(ImageView) vRef.get();' –

1

您可以創建你的異步任務構造函數,通過它你可以通過視圖並在需要時使用它在你的AsyncTask。

像下面

private class taskMensaje extends AsyncTask<String, Void, String> { 

    private View _view 
    public taskMensaje(View view){ 
     this._view = view; // this you can use ahead wherever required 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest); 
     gestionables = parserMensGest.parse(); 

     mess_gest = gestionables.get(0).p0; 
     return ""; 
    } 
} 
+0

謝謝你的迴應,並且呢? 如何發送我的視圖vMens? – jlopez

+0

你已經在做:) new taskMensaje(vMens).execute(); –

+0

爲什麼View已經在你的asynctask中使用了第三個參數? –

0

試試這個

如果你想發送 View作爲參數 AsyncTask
vMens.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View vMens) { 
      int readOK=0; 
      try{ 
       new taskMensaje().execute(vMens); 

       if(mess_gest.equals("1")){ 
        readOK=1; 
       }else{ 
        readOK=0; 
       } 
      }catch(Exception e){ 
       Utils.showDialog(Calendario.this, "Error", "No se puede gestionar el mensaje"); 
      } 
       if (readOK==0){ 
        Mess.state = message.get(vMens.getId()).p1; 
        Mess.tittle = message.get(vMens.getId()).p2; 
       else{ 
        //message no gest 
       } 
     } 
    }); 

private class taskMensaje extends AsyncTask<View, Void, String> { 



    @Override 
     protected String doInBackground(View... params) { 
      //Do what ever you want to do with this view 
    View v=params[0]; 
      return ""; 
     } 
    } 
+0

這幾乎是正確的,你應該調用「new taskMensaje()。execute(vMens);」 – Carnal

+0

@Carnal你是對的 –

+0

改變它,我會投你:) – Carnal

1

,簡單的答案是請勿

意見來來去去,當你的AsyncTask結束時,你的View已經死了,並且試圖訪問它並不會給你任何除了悲傷和挫折之外的任何東西。

異步處理數據的正確模式是創建一個單獨的數據處理類,它是Observable,包括所有的AsyncTasks,花裏胡哨的。使您的View類的Observer,其註冊接收更新,只是等待,直到處理數據,並通過update()回調給它。

請記住,AsyncTask是故意作出SEPARATE從UI的數據處理,它試圖綁定它是完全不合邏輯的。