2017-10-22 10 views
0

AsyncTask가 완료되면 어떻게 잡을 수 있습니까? AsyncTask를 확장하는 ProfileUpdate 클래스가 있으며이 메서드를 호출하는 다른 작업에서부터 데이터를 업데이트해야합니다. asynctask가 끝난 것을 어떻게 알 수 있습니까? 다른 클래스의 asynctask 메소드이며 activity 클래스가 아닙니다!AsyncTask가 이미 완료되었습니다.

이되는 활동 내 onRefresh 방법 :

@Override 
public void onRefresh() { 
    if (!AlertView.isInternetAvailable(getContext())) { 
     swipeLayout.setRefreshing(false); 
     Toast.makeText(getContext(), Messages.CONNECTION_ERROR + ": " + Messages.NO_INTERNET, Toast.LENGTH_SHORT).show(); 
    } else { 
     getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       new UpdateProfile(getActivity(), swipeLayout, sharedPreferences.getString(Constants.TOKEN, ""), user.getIin()).execute(Urls.GET_USER); 
      } 
     }); 
     profileDefaults(); 
    } 
} 

여기 내 AsyncTask를 방법 :

public class UpdateProfile extends AsyncTask <String, Void, String> { 
private Activity activity; 
private SwipeRefreshLayout swipeRefreshLayout; 
private String token; 
private String userIin; 
private SharedPreferences sharedPreferences; 

public UpdateProfile(Activity activity, SwipeRefreshLayout swipeRefreshLayout, String token, String userIin) { 
    this.activity = activity; 
    this.swipeRefreshLayout = swipeRefreshLayout; 
    this.token = token; 
    this.userIin = userIin; 
    sharedPreferences = this.activity.getSharedPreferences(Constants.PROJECT, Context.MODE_PRIVATE); 
} 

@Override 
protected String doInBackground(String... params) { 
    URL url = null; 
    try { 
     url = new URL(params[0]); 
     try { 
      OkHttpClient okHttpClient = new OkHttpClient(); 
      RequestBody body = new FormBody.Builder() 
        .add("iin", userIin) 
        .build(); 

      Request request = new Request.Builder() 
        .url(url) 
        .addHeader(Constants.AUTH_TOKEN, token) 
        .post(body) 
        .build(); 
      Response responses = null; 
      try { 
       responses = okHttpClient.newCall(request).execute(); 
      } catch (Exception e) { 
       AlertView.showAlertView(activity, Messages.CONNECTION_ERROR, Messages.NO_INTERNET, Messages.OK); 
      } 

      assert responses != null; 
      return responses.body().string(); 

     } catch (Exception e) { 
      AlertView.showAlertView(activity, Messages.CONNECTION_ERROR, Messages.NO_INTERNET, Messages.OK); 
     } 
    } catch (Exception e) { 
     AlertView.showAlertView(activity, Messages.CONNECTION_ERROR, Messages.NO_INTERNET, Messages.OK); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    try { 
     JSONObject jsonObject = new JSONObject(s); 
     int code = Integer.valueOf(jsonObject.getString(Constants.CODE)); 
     if (code == Codes.OK) { 
      Toast.makeText(activity, "Данные обновлены", Toast.LENGTH_SHORT).show(); 

      String userHeader = jsonObject.getString("user"); 
      JSONObject userInfo = new JSONObject(userHeader); 

      String mobilePhone = userInfo.getString(SingletonConstants.MOBILE_PHONE); 
      Boolean isActive = userInfo.getBoolean(SingletonConstants.IS_ACTIVE); 
      Boolean signedAgreement = userInfo.getBoolean(SingletonConstants.SIGNED_AGREEMENT); 
      Boolean esfEntered = userInfo.getBoolean(SingletonConstants.ESF_ENTERED); 
      String address = userInfo.getString(SingletonConstants.ADDRESS); 
      String iin = userInfo.getString(SingletonConstants.IIN); 
      String certExpDate = userInfo.getString(SingletonConstants.CERT_EXP_DATE); 
      String firstName = userInfo.getString(SingletonConstants.FIRST_NAME); 
      String middleName = userInfo.getString(SingletonConstants.MIDDLE_NAME); 
      String workPhone = userInfo.getString(SingletonConstants.WORK_PHONE); 
      String secondName = userInfo.getString(SingletonConstants.SECOND_NAME); 
      String avatarUrl = userInfo.getString(SingletonConstants.AVATAR_URL);; 
      String secondEmail = userInfo.getString(SingletonConstants.SECOND_EMAIL); 
      String email = userInfo.getString(SingletonConstants.EMAIL); 

      User newUser = new User(mobilePhone, isActive, signedAgreement, esfEntered, address, iin, certExpDate, firstName, middleName, workPhone, secondName, avatarUrl, secondEmail, email); 

      Gson gson = new Gson(); 
      String userGson = gson.toJson (newUser); 
      sharedPreferences.edit().putString(SingletonConstants.USER, userGson).apply(); 
      swipeRefreshLayout.setRefreshing(false); 

     } else { 
      AlertView.showAlertView(activity, Messages.ERROR, jsonObject.getString(Constants.MESSAGE), Messages.OK); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

내가 (profileDefaults를 호출 할 수 있습니다 방법)? 그것은 내 활동에있다. 그리고 그것을 onPostExecute 후에 호출해야합니다!

+0

왜 비동기 작업을 처리하는 클래스를 소비하는 활동의 내부 클래스로 만들지 않겠습니까? 이것은 내가 전에 사용했던 패턴이며, 나는 당신의 문제를 본 적이 없다. –

+1

@TimBiegeleisen 물론,이 액티비티는 내 액티비티 안에 쓸 수 있지만,이 액티비티에는 asynctask 메서드가 여러 개 있습니다. 정말 많은 코드이고, 다른 클래스의 각 asynctask 메서드를 나누고 싶습니다. –

+0

참조를 전달할 수 있습니까? 호출하는 활동에 할당 한 다음이를 사용하여 클래스 수준 변수를 할당합니까? –

답변

1

청결한 방법은 인터페이스를 리스너로 사용하는 것입니다.

private OnAsyncFinished onAsyncFinished; 
public UpdateProfile(..., OnAsyncFinished onAsyncFinished) { 
    ... 
    this.onAsyncFinished = onAsyncFinished; 
} 
... 
@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    onAsyncFinished.onAsyncFinished(s); //This will notifiy the method on main activity, and you can now resume the work there 
    ... 
} 

이 당신의 주요 활동에 인터페이스를 구현 :

public MainActivity extends Activity implements OnAsyncFinished { 
    @Override 
    public void onAsyncFinished(Object o) { 
     //This will get called after onPostExecute, do what u want with the object you got from onPostExecute, json or string in ur example 
     profileDefaults(); //call ur function 
    } 
} 

편집 :

public interface OnAsyncFinished{ 
    void onAsyncFinished(Object o); 
} 

이 AsyncTaskClass 생성자의 매개 변수로 인터페이스를 추가 :이 인터페이스를 만들기 주요 활동 패스에 비동기 작업을 만들 때 this에서 생성자 likeso :

 @Override 
     public void run() { 
      new UpdateProfile(..., this).execute(Urls.GET_USER); 
     } 
+0

생성자에서 onAsyncFinished를 전달하는 방법은 무엇입니까? –

+0

내 대답 – riadrifai

+0

을 편집하고 어떻게 조각으로 할 수 있습니까? –