如何一个接口可以用于不同的背景android任务?
那么,我有一个活动类与两个后台任务(asynchronous任务)已被定义在两个单独的类像
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数组,所以我需要为每个服务分别创build接口。
这个案例应该以什么为主?
我能想到的最简单的解决scheme是修改您的DelegateTaskCompleted
接口,如下所示:
public interface DelegateTaskCompleted{ public void JsonArrayLoaded(AsyncTask<String, String, String> task, JSONArray result); }
然后你的onPostExecute
会发送回来,如下所示:
protected void onPostExecute(String file_url) { pDialog.dismiss(); delegate.JsonArrayLoaded(this, gotNearestbeacons); }
最后,在MainClass
,可以根据AsyncTask
的types进行条件检查:
@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
但添加一个抽象variables进行标识。
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
方法。
public class GettingAirports extends AsyncTask<String, String, String> { public int getId(){ return ID_AIRPORT; } }
然后,而不是做一个条件if (task instanceof GettingAirports)
你可以做一个switch
语句如下:
switch(task.getId()){ case TrackableAsyncTask.ID_AIRPORT: // run airport code }
希望这可以帮助。
嗨,这段代码将帮助你
这是callback的界面
public interface CallbackReceiver { public void receiveData(Object result); }
使用Asynctask类作为Abstract类
public abstract class JsonDataCallback extends AsyncTask<String, String, String> implements CallbackReceiver { private ProgressDialog mProgressDialog; Handler handler; Runnable callback; Activity activity; public JsonDataCallback(Activity activity) { this.activity=activity; mProgressDialog = new ProgressDialog(activity); mProgressDialog.setMessage("Loading Please Wait."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); } public abstract void receiveData(Object object); @Override protected void onPreExecute() { mProgressDialog =ProgressDialog.show(activity, "", "Please Wait",true,false); super.onPreExecute(); } @Override protected String doInBackground(String... aurl) { String results=""; // do stuff return results; } @Override protected void onPostExecute(String jsonData) { if (mProgressDialog != null || mProgressDialog.isShowing()){ mProgressDialog.dismiss(); } if(jsonData!=null) { receiveData(jsonData); } } }
而在你的代码中使用它就像这样
String url = ipaddress + "/GrantAdvanceList; JsonDataCallback callbackservice = new JsonDataCallback(yourActivity.this) { @Override public void receiveData(Object object) { jsonRecordsData = (String)object; //do stuff with call back data } }; callbackservice.execute(url, null, null);
你可以用这种方式重用代码,我希望这会帮助你。 提前致谢。
你也可以考虑处理程序来实现这一点。 在Activity中创build处理程序,将这个处理程序对象传递给每个AsyncTask。 在onPost调用handler.sendEmptyMessage(CONSTANT_INT); 在Handler中,handleMessage检查if或者switch中的msg.what这种方式只会创build一个处理程序的一个对象,并在多个调用中用于一个活动的asynchronous
如果我正确理解你的问题,你已经扩展了一些AsyncTask。 每个子类的目标是将一个JSONArray传递给一个实现了DelegateTaskCompleted的Activity,在那里你将会做一些事情。 挑战是你想对这个JSONArray做的“事情”是不同的,取决于哪个AsyncTask产生它。
走出这些假设,有许多不同的方法可以区分哪个AsyncTask JSONArray来自:
- 在DelegateTaskCompleted类文件中为每个需要处理的JSONArraytypes创build一个静态variables,例如int。 向
JsonArrayLoaded
添加一个相同types的variables的参数。 然后,使用if-else语句或switch语句来检查这个variables,并根据它执行JSONArray的操作。 - 如果您有权访问任何正在生成JSONArray,请使数组的0索引包含有关如何parsing它的信息。 (也许你可以用if-else或switch来比较一下)
- 正如你所build议的,为每个AsyncTask创build一个单独的接口,或者使用多个方法创build一个单独的接口。
只有选项3是面向对象的解决scheme,正如已经在评论中指出的那样,由于可伸缩性而不是很好的解决scheme。 这绝不是一个完整的清单,只是我的一些想法。
我想知道,如果它是值得使用接口,或至less在提出的方式。 由于你已经有了不同的AsyncTask子类来处理生成的JSONArray,所以为什么不在doInBackground()
方法的主线程之内做任何你正在做的事情,或者至less把逻辑放在这些类的某个地方,并只是返回结果(或者可能将它们填入数据库,并在需要时得到它们)。 我在想,可能有一个更好的方法来处理你的AsyncTaskinheritance,它避免了所有的接口,或者至less用不同的方式来使用它们,比如所有的AsyncTasks都实现了一个接口。
如果你能澄清你的问题并解释AsyncTasks和你的JSONArrayLoaded
方法正在执行的操作types,那么这将是非常有帮助的,也许你的理由是按照你的方式使用接口。 很难给出一个关于面向对象最佳实践的具体的面向对象的答案或build议,只有很less的信息能够代表你的代码正在做什么,并希望达到什么目的。
添加一个成员variables到两个AsyncTask类,即,
public class GettingBeaconsList extends AsyncTask<String, String, String> public class GettingAirports extends AsyncTask<String, String, String>
如
private int flag;
并为此写入setter
public void setFlag(int flag) { this.flag = flag; }
在MainClass中:
GettingBeaconsList beaconsList = new GettingBeaconsList(context,MainClass.this); beaconsList.setFlag(100); //Declare this flag in integer constant. beaconsList.execute(); GettingAirports airports = new GettingAirports(context, MainClass.this); airports.setFlag(200); airports.execute();
在这两个AsyncTask类传递标志与委托的方法: –
protected void onPostExecute(String file_url) { pDialog.dismiss(); delegate.JsonArrayLoaded(gotNearestbeacons, flag); //Change the signature of this method }
再次在MainClass中处理响应:
@Override public void JsonArrayLoaded(JSONArray result, int flag) { // Here check which Background task has been completed if(flag == 100) // GettingBeaconsList is executed if(flag == 200) // GettingAirport is executed. // 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 } }
我build议你简单地使用n实现DelegateTaskCompleted
的Activity的内部类。 它简单,高效,清晰易懂(考虑维护) – 并且在构buildAsyncTasks时已经传递了委托,那么是否已经有了这种方法?
public class MainClass extends Activity { // probabnly not static ;) private final class BeaconsDelegate implements DelegateTaskCompleted ... private final class AirportsDelegate implements DelegateTaskCompleted ... }