好吧,我有一个带有两个后台任务(异步任务)的活动类,这两个类在两个单独的类中定义,例如
public class GettingBeaconsList extends AsyncTask<String, String, String> public class GettingAirports extends AsyncTask<String, String, String>
在 MainClass* 中初始化并执行 *
public class MainClass extends Activity implements DelegateTaskCompleted { int ServiceBoolean = 0; public OnClickListener LoadingBeaconList = new OnClickListener() { public void onClick(View v) { ServiceBoolean =1; new GettingBeaconsList (context,MainClass.this).execute(); } } public OnClickListener LoadingAirportList= new OnClickListener() { public void onClick(View v) { ServiceBoolean =2; new GettingAirports(context,MainClass.this).execute(); } } @Override public void JsonArrayLoaded(JSONArray result) { // bla bla or whatever here i write, does not matter if(ServiceBoolean == 1) { // Load activity 5 } else if( ServiceBoolean == 2) { // Load activity 6 } else if( ServiceBoolean==3 ) { // display Toast or Alert Box or load Activity number 8 } } }
现在在上面的代码MainClass.this中,该接口作为接口引用存储在这样的AsynTask子类中
private Context context = null; private DelegateTaskCompleted delegate = null; public GettingBeaconsList (Context context,DelegateTaskCompleted delegate) { this.context = context; this.delegate = delegate; } // And constructor of second AsynTask is same as of First AsynTask Class private Context context = null; private DelegateTaskCompleted delegate = null; public GettingAirports (Context context,DelegateTaskCompleted delegate) { this.context = context; this.delegate = delegate; }
每个AsynTask类或子类的onPostExecute,JSONArray返回或传递回调用类,如下所示。在这种情况下,调用类为 MainClass, 但其他活动类使用相同的AsynTask类( GettingBeaconsList 和 GettingAirports )
protected void onPostExecute(String file_url) { pDialog.dismiss(); delegate.JsonArrayLoaded(gotNearestbeacons); }
现在,我在 MainClass中 有一个方法(JsonArrayLoaded)处理来自两个不同后台任务或服务的两个响应。我正在使用条件来确定执行了哪个服务/类或AsynTask。
但是我正在寻求解决这种情况的最佳方法,例如,如果将来我们有5个或更多的后台服务,并且它们也只返回JSON数组,那么我是否需要为每个服务创建单独的接口?
在这种情况下,面向对象的出路应该是什么?
我能想到的最简单的解决方案是修改DelegateTaskCompleted界面,如下所示:
DelegateTaskCompleted
public interface DelegateTaskCompleted{ public void JsonArrayLoaded(AsyncTask<String, String, String> task, JSONArray result); }
然后,您onPostExecute将自己发送回如下所示:
onPostExecute
protected void onPostExecute(String file_url) { pDialog.dismiss(); delegate.JsonArrayLoaded(this, gotNearestbeacons); }
最后,MainClass您可以在中根据以下类型进行条件检查AsyncTask:
MainClass
AsyncTask
@Override public void JsonArrayLoaded(AsyncTask<String, String, String> task, JSONArray result) { if(task instanceof GettingBeaconsList) { // do stuff related to the beacon list } else if(task instanceof GettingAirports) { // do airport list stuff } }
这样一来,您就可以轻松识别AsyncTask通过响应发送的,而不必跟踪响应的时间(如果一个花费的时间比另一个花费的时间长)等。
或者,让另一个类扩展,AsyncTask但添加一个抽象变量以进行标识。
public class TrackableAsyncTask extends AsyncTask<String, String, String>{ public abstract int getId(); public static final int ID_AIRPORT = 1; public static final int ID_BEACONS = 2; ... etc }
然后让您的机场和灯塔AsycTasks扩展此范围。这将要求他们实施该getId方法。
AsycTasks
getId
public class GettingAirports extends AsyncTask<String, String, String> { public int getId(){ return ID_AIRPORT; } }
然后,if (task instanceof GettingAirports)除了执行条件操作外,还可以执行以下switch语句:
if (task instanceof GettingAirports)
switch
switch(task.getId()){ case TrackableAsyncTask.ID_AIRPORT: // run airport code }
希望这可以帮助。