2014-01-30 2 views
0

HTTP 요청을 수행해야하는 여러 가지 활동이 있습니다 (JSON 요청을 보내면 다른 JSON 오브젝트를 다시 가져옵니다).다른 유형을 활동으로 전달하십시오.

제 아이디어는 모든 요청에 ​​대해 하나의 AsyncTask를 공유하는 것이 었습니다. 나는 요청을 실행 한 후에 메소드를 호출 할 수 있도록 Activity를 매개 변수로 전달합니다.

내 Activity (MainActivity.class, SecondActivity.class)의 클래스가 될 AsyncTask에 하나 이상의 매개 변수를 전달하고 해당 정보를 사용하여 올바른 유형의 Activity를 캐스팅 한 다음 나중에 호출하십시오 메소드 (모든 활동에 대해 동일한 메소드 이름이 됨).

콜백 메서드를 사용하여 인터페이스를 만들 수도 있지만 둘 다 작동하지 않을지 확실하지 않습니다.

이 방법이 효과가 있습니까? 그렇지 않습니까?

의견을 보내 주셔서 감사합니다.

내 코드 :

공용 클래스 HTTPReq이

답변

0

그것은 그런 식으로 할 수있는 잘못된 접근입니다 AsyncTask를 {

private MainActivity callerActivity; 

@Override 
protected String doInBackground(Object... params) { 
    String data = (String) params[0]; 
    String cookie = (String) params[1]; 
    callerActivity = (MainActivity) params[2]; 

... 
} 

@Override 
protected void onPostExecute(String result) { 
    callerActivity.ProcessHTTPReqAnswer(result); 
    super.onPostExecute(result); 
} 

}을 확장합니다. BroadcastReceiver를 사용해야합니다. AsyncTask가 완료되면 결과를 브로드 캐스트로 보냅니다. 각각의 활동은 관심있는 결과를 듣게됩니다. 이렇게하면 아무도 위험한 활동을 참조 할 필요가 없습니다.

다음은 예입니다.

IntentFilter filter = new IntentFilter(); 
filter.addAction("result1"); 
LocalBroadcastManager.getInstance(getSupportActivity()).registerReceiver(new CustomBroadcastReceiver(), filter); 

은 AsyncTask를에서 위로 활동이

@Override 
protected void onPostExecute(String result) { 
    Intent intent = new Intent("result1").putExtra(
       "data", result); 
    LocalBroadcastManager.getInstance(getSupportActivity()).sendBroadcast(intent); 
    super.onPostExecute(result); 
} 

을,이

private class CustomBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle bundle = intent.getExtras(); 
     if ("result1".equalsIgnoreCase(intent.getAction())) { 
      String result = bundle.getString("data"); 
      // Process the result here. 
     } 
    } 
} 
+0

My Asynctask는 다른 클래스에서 정의되므로 다른 활동에서 호출 할 수 있습니다. "getSupportActivity()"를 사용하여 주요 활동을 가져올 수 없으며 "컨텍스트"객체를 Asyntask에 전달해야합니다. 그러면 잘 작동합니다. – user652341

2

Aswins 대답을하는 것은 끔찍한 아니지만 여전히 가장 효율적인 방법이 아니다.

콜백 메소드가있는 인터페이스를 선언하십시오. 당신의 AsyncTask를 해당 인터페이스의 인스턴스를 통과 한 후 경우 비동기 작업이 그것을 호출이 자사가 내 예에 따라

아래 인터페이스 :

public interface IMyCallbackInterface { 
    void onCallback(String result); 
    } 

비동기 작업 :

public MyAsyncTask extends AsyncTask<..., String> { 

     private IMyCallbackInterface mCallback; 


     public MyAsyncTask(..., IMyCallbackInterface callback) { 
      mCallback = callback; 
     } 

     protected String doInBackground(Object... params) { 
     .... 
     } 

     protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if (mCallback != null) { 
       mCallback.onCallback(result); 
     } 
     } 

활동 :

 public MyActivity extends Activity { 

      private void someMethod(){ 
       new MyAsyncTask(..., new IMyCallbackInterface() { 

        public void onCallback(String result) { 
          //TODO use the result to do whatever i need 
          //I have access to my aactivity methods and member variables here 
        } 
       }.execute(); 
      } 
     } 
관련 문제