当前位置: 首页 > 面试题库 >

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

堵宏毅
2023-03-14
问题内容

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

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

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


问题答案:

我能想到的最简单的html" target="_blank">解决方案是修改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
}

希望这可以帮助。



 类似资料:
  • 后台主界面 1.菜单列表区 2.功能展示区 3.快捷工具区 4.官方链接,帮助区 5.风格切换区 6.主导航区

  • Celery 是一个 Python 的任务队列,包含线程/进程池。曾经有一个 Flask 的集成, 但在 Celery 3 重构了内部细节后变得不必要了。本指导补充了如何妥善在 Flask 中使用 Celery 的空白,但假设你已经读过了 Celery 官方文档中的教程 使用 Celery 的首要步骤 安装 Celery Celery 提交到了 Python Package Index (PyPI

  • 你能告诉我在Android中做同步工作的正确方法是什么吗(例如,如果我有大约5个工作)<注意 我所说的同步作业是指在后台运行并通过Web服务发送一些数据(如分析)的线程。。。 有关更多详细信息,请阅读更详细的描述: 我的任务是实现一些后台作业,这些作业将使一些数据与restful web服务同步。一些作业应定期安排,并有特定的延迟。如果没有internet连接,我只需缓存数据,然后当连接再次出现时

  • 我正在使用rxjava将一些任务上载到服务器,每当任务启动的片段或活动被销毁时,我都会处理订阅以避免内存泄漏,但我想要的是,即使在片段/活动被销毁后,我也需要继续在后台运行任务,有什么方法可以实现这一点吗? 实例 是否必须始终释放订阅?如果不是,何时使用dispose?

  • 我有一个后台服务,每天下午1点打电话给我。下午1点,我的Firebase数据库中的3个值应设置为0。当用户启动某个活动时,会触发后台服务。如我所愿,值在下午1点重置为0,但每次下午1点后,当用户启动活动时,服务都会运行重置我的值。如何在下午1点将值重置为0,直到第二天下午1点才再次重置? 下面是我在服务类中的代码 这是启动服务的代码。此方法在此活动的oncreate方法中调用。

  • 2024/9/26 15:00 - 自我介绍 - HashMap底层 - HashMap可以key为null吗? - 基本数据类型和包装数据类型区别 - ==和equal()区别 - 基本包装数据类型可以用==比较吗?这里我理解的是一个基本数据类型和包装数据类型之间不能用==比较,面试官可能想的不一样,他想问的是包装数据类型之间可否用==比较 - Runnable和Callable区别 - JVM