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或其他的主要内容,如果未能解决你的问题,请参考以下文章