传递不同类型的活动

时间:2014-01-30 22:38:40

标签: android android-activity android-asynctask

我有几个需要执行HTTP请求的活动(发送JSON请求再获取另一个JSON对象)。

我的想法是为所有这些请求共享一个AsyncTask。我将Activity作为参数传递,以便在完成请求的执行后我可以调用方法。

我想将另外一个参数传递给我的AsyncTask,它将是我的Activity类(MainActivity.class,SecondActivity.class),然后使用该信息将Activity转换为正确的类型,然后再调用方法(与所有活动的方法名称相同)。

我也可以使用我的回调方法创建一个界面,但我不确定我是否也不会这样做。

这可行或者我的方法在这里错了吗?

感谢您的反馈。

我的代码:

公共类HTTPReq扩展了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);
}

}

2 个答案:

答案 0 :(得分:2)

Aswins的回答并不可怕,但它仍然不是最有效的方式。

声明一个具有回调方法的接口。将该接口的实例传递给您的asynctask然后让async任务调用它,如果它在那里根据我的例子

接口:

  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();
          }
      }

答案 1 :(得分:0)

这样做是错误的做法。你应该使用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.
        } 
    }
}