2012-03-30 31 views
0

我想將我的片段傳遞給一個ASyncTask類,以便在任務完成後更新片段中的一個或兩個小部件。這裏就是我處理:是否有可能在構造函數中傳遞一個片段?

​​

而且LoginTask:

public class LoginTask extends AsyncTask<String, Void, Integer> { 

private ProgressDialog progressDialog; 
private Polling activity; 
private int id = -1; 
private JSONParser jsonParser; 
private static String loginURL = "http://davidjkelley.net/android_api/"; 
private static String registerURL = "http://davidjkelley.net/android_api/"; 
private static String KEY_SUCCESS = "success"; 
private static String KEY_ERROR = "error"; 
private static String KEY_ERROR_MSG = "error_msg"; 
private static String KEY_UID = "uid"; 
private static String KEY_NAME = "name"; 
private static String KEY_EMAIL = "email"; 
private static String KEY_CREATED_AT = "created_at"; 
TextView loginErrorMsg = (EditText)activity.findViewById(R.id.loginErrorMsg); 
EditText userName = (EditText)activity.findViewById(R.id.emailEditText); 
EditText passwordEdit = (EditText)activity.findViewById(R.id.passEditText); 

public LoginTask(Polling activity, ProgressDialog progressDialog) 
{ 
    this.activity = activity; 
    this.progressDialog = progressDialog; 
} 

所以我想第三個參數添加到LoginTask的構造,基本上我LoginFragment的一個實例。我的目標是更新TextView或在屏幕上放置一個Toast來澄清登錄是成功還是失敗:現在,用戶無法告訴登錄是如何進行的。想法?

回答

4

好奇說,你不想被周圍路過片段(他們有一個「鏈接」到這是一個方面的活動和通過上下文是baaad)

你想傳遞一個小對象,可以幫助您從任務回調到您的片段。

我也會使用一個接口。這是我的例子:

片段:

public class LoginFragment extends Fragment implements OnClickListener, OnLoginListener{ 

    Button loginButton; 
    TextView loginErrorMsg; 
    private ProgressDialog progressDialog; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     progressDialog = new ProgressDialog(activity); 
     progressDialog.setMessage("Logging in..."); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_login, container, false); 

     loginButton = v.findViewById(R.id.button); 
     loginButton.setOnClickListener(this); 

     return v; 

    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
     case R.id.button: 
      Log.v("LoginF", "onclick"); 
      progressDialog.show(); 
      LoginTask loginTask = new LoginTask(this); 
      loginTask.execute(); 
      break; 
     default: 
      break; 
     } 
    } 

    @Override 
    public void onLoginSuccess() { 
     progressDialog.dismiss(); 
     // Yayy 
    } 

    @Override 
    public void onLoginFailure() { 
     progressDialog.dismiss(); 
     // Boo 
    } 
} 

的的AsyncTask:

public class LoginTask extends AsyncTask<String, Void, Integer> { 

    private final OnLoginListener listener; 

    public interface OnLoginListener{ 
     public void onLoginSuccess(); 
     public void onLoginFailure(); 
    } 

    public LoginTask(OnLoginListener listener) { 
     this.listener = listener; 
    } 

    @Override 
    protected Integer doInBackground(String... params) { 
     try{ 
      // Something 
     } catch (SomeException e){ 
      listener.onLoginFailure(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
     listener.onLoginSuccess(); 
    } 

} 

如果你讓你的頭周圍的接口你的世界就會敞開心扉,你的代碼看起來不那麼像亞馬遜叢林和更像一個組織良好的花園;-)

+0

我更喜歡這個,因爲它更接近Android的東西(特別是聽者模式)。在實踐中,我使用抽象基類而不是接口,因爲回調方法通常有一些默認實現。 – curioustechizen 2012-03-30 08:59:30

1

我建議你爲此使用回調接口。將UI特定的(實際上是特定於上下文的)對象傳遞給AsyncTask通常不是一個好主意。

這是我的建議。採用這種方法,您甚至不需要傳入Fragment左右。

聲明:我沒有真正嘗試運行這段代碼 - 只是將它輸入了我的頭頂。所以它甚至可能不會編譯 - 它僅僅是一個指導。

interface LoginCallback{ 
    void onLoginSuccess(); 
    void onLoginFailure(); 
} 


//onCreate code 
TextView loginErrorMsg = (EditText)activity.findViewById(R.id.loginErrorMsg); 
EditText userName = (EditText)activity.findViewById(R.id.emailEditText); 
EditText passwordEdit = (EditText)activity.findViewById(R.id.passEditText); 


LoginTask loginTask = new LoginTask(new LoginCallback(){ 
    @Override 
    protected void onLoginSuccess(){ 
     //Update UI 
    } 

     @Override 
    protected void onLoginFailure(){ 
     //Update UI 
    } 
}); 

loginTask.execute(); 



//LoginTask code. 
public class LoginTask extends AsyncTask<String, Void, Integer> { 
    LoginCallback callback; 
    ProgressDialog progressDialog; 

    public LoginTask(LoginCallback callback){ 
     this.callback = callback; 


     @Override protected void onPreExecute(){ 
      progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setMessage("Logging in..."); 

     } 

     @Override 
     protected Integer doInBackground(String... params){ 
      //Do you login logic here. 

     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      progressDialog.dismiss(); 
      if(loginSuccess){ 
       callback.onLoginSuccess(); 
      } else { 
       callback.onLoginFailure(); 
      } 
     } 
    } 
} 
+0

哦jeez,我從來沒有提出過一個接口。今晚我不會嘗試這樣做(現在是凌晨3點!),但是當我明天開始時,我會研究這個解決方案,如果需要的話,按照答案投票/標記。謝謝! – Davek804 2012-03-30 07:27:00

+0

我會定義ASyncTask中的接口,並檢查它是否爲null,或者將其聲明爲final以確保實例化。 – Blundell 2012-03-30 07:27:24

+0

@Blundell當然。就像我說的這個代碼不是100% - 只是一個directio :)。還有很多其他的東西需要注意 - 比如只在沒有運行時才顯示對話框等等。 – curioustechizen 2012-03-30 07:36:02

相關問題