我有几个需要执行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);
}
}
答案 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.
}
}
}