Android最好使用AsyncTask、Service或其他

Posted

技术标签:

【中文标题】Android最好使用AsyncTask、Service或其他【英文标题】:Android best use AsyncTask, Service or other 【发布时间】:2017-10-20 11:48:51 【问题描述】:

我是一名学生,正在编写一些应用程序来了解和学习 android 开发。 我正在尝试编写一个应该像这样工作的应用程序:

地图活动:

显示带有用户位置的地图并在某个范围内打开访问点。 用户和AP位置应该由“MainClass”接收。

主类:

这应该完成主要工作。它应该获取用户位置,从 db 中获取开放接入点,并将通过 WifiManager 扫描发现的新开放 AP 插入到 db 中。

现在,在用户同意的情况下,MainClass 应该在后台运行,即使应用程序已关闭。

我的问题是:

    我应该在新线程还是 UI 线程上做 MainClass 的事情? MainClass 应该是 AsyncTask、Service 还是其他?请告诉我为什么。 扫描操作返回在已注册接收器中执行的扫描。它是在 UI 线程上运行还是在新线程上运行?

提前致谢。

更新;

所以,如果我没有搞错你在说什么,服务应该是这样的:

public class MainService extends Service 
    Thread mainThread;
    @Override
    public void onCreate() 
        mainThread = new Thread(new Runnable() 
            @Override
            public void run() 
                ....
                mainOperation();
                ....
            
        );
        mainThread.setPriority(Process.THREAD_PRIORITY_BACKGROUND);
    

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
        Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
        mainThread.run();
        return START_STICKY;
    

    @Override
    public IBinder onBind(Intent intent) 
        return null;
    

    @Override
    public void onDestroy() 
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
    
   

杀死时的 START_STICKY 是否调用 onStartCommand 或 onCreate?

【问题讨论】:

【参考方案1】:
    我应该在新线程还是 UI 线程上做 MainClass 的事情?

答案: 你应该在后台线程(新线程)上做,因为 android 不允许 UI 线程上的网络任务,如果你在 UI 线程上花时间操作 UI 将冻结

    MainClass 应该是 AsyncTask、Service 还是其他?请告诉我为什么。

答案: 正如您明确表示的那样,您的要求(MainClass 应该在后台工作)您需要使用Service,因为即使您的应用程序被杀死,服务也会在后台运行

【讨论】:

【参考方案2】:

    你应该在后台线程中使用 MainClass.java 的东西。即服务

    服务将通过广播接收器触发数据。

    广播接收器会将数据发送到 MapActivity.java。注册接收者的 onReceive() 方法总是在 UI 线程中运行。

如果你想在前台运行 MainClass.java 的东西,你可以使用 MVP 模式。你应该把你的东西放入表示层。

【讨论】:

很好的答案,但更具体:我认为他需要前台服务。因为即使应用程序关闭,它也必须运行。在 Android 打瞌睡模式下,没有其他选择可以实现这一点(据我所知)。 @jobbert,可以选择使用 MVP 模式完成此案例。 @jobbert 你是对的。如果 OP 不希望服务因操作系统的突发奇想而被终止,那么他们需要前台服务。 好的,我应该使用Service还是IntentService?如果我是对的:服务在 UI 线程上运行,但 startForeground() 进入一个新线程? IntentService 有自己的线程,所以它最像我需要的那个?他们是否被操作系统杀死,如果是,如何重新启动? OP,您需要一个在前台启动的正常服务。否则安卓会在后台杀掉资源以防止电池丢失。当您打算在后台获得一些重要的东西而不是您现在需要的东西时,就会使用意图服务。有了这些信息,您应该能够在 Google/SO 上搜索所有内容以使其正常工作。 @Silambarasan Poonguti,我不是在谈论如何从服务中获取信息。【参考方案3】:

我猜后台服务将是满足您要求的最佳且唯一的解决方案。因为您希望即使您的应用关闭,您的操作也能继续运行。

【讨论】:

以上是关于Android最好使用AsyncTask、Service或其他的主要内容,如果未能解决你的问题,请参考以下文章

Android AsyncTask 用于长时间运行的操作

在 Android 应用程序中使用 AsyncTask 在 for 循环期间更新 ProgressBar

android AsyncTask 怎么返回值给UI线程

在 AsyncTask 或 Service 上下载文件?

Android UI 线程消息队列调度顺序

android AsyncTask使用