一尘不染

一个界面如何用于不同的后台android任务?

java

好吧,我有一个带有两个后台任务(异步任务)的活动类,这两个类在两个单独的类中定义,例如

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数组,那么我是否需要为每个服务创建单独的接口?

在这种情况下,面向对象的出路应该是什么?


阅读 255

收藏
2020-09-08

共1个答案

一尘不染

我能想到的最简单的解决方案是修改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

 @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方法。

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
}

希望这可以帮助。

2020-09-08