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

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

地图活动:

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

主类:

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

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

我的问题是:

  1. 我应该在新线程还是 UI 线程上做 MainClass 的事情?
  2. MainClass 应该是 AsyncTask、Service 还是其他?请告诉我为什么。
  3. 扫描操作返回在已注册接收器中执行的扫描。它是在 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?

【问题讨论】:

    标签: android multithreading android-asynctask android-service android-broadcastreceiver


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

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

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

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

    【讨论】:

      【解决方案2】:
      1. 你应该在后台线程中使用 MainClass.java 的东西。即服务

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

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

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

      【讨论】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2020-12-16
        • 1970-01-01
        • 2016-12-08
        相关资源
        最近更新 更多