Android最好使用异步任务、服务或其他

Android最好使用异步任务、服务或其他,android,multithreading,android-asynctask,android-service,android-broadcastreceiver,Android,Multithreading,Android Asynctask,Android Service,Android Broadcastreceiver,我是一名学生,写一些应用程序来理解和研究Android开发。 我正在尝试编写一个应用程序,其工作原理如下: public class MainService extends Service { Thread mainThread; @Override public void onCreate() { mainThread = new Thread(new Runnable() { @Override publ

我是一名学生,写一些应用程序来理解和研究Android开发。 我正在尝试编写一个应用程序,其工作原理如下:

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();
    }
}   
地图活动: 显示一张地图,其中包含用户位置和范围内的开放接入点。 “MainClass”应接收用户和AP位置

主要类别: 这应该是主要的工作。它应该获得用户位置,从db获得开放访问点,并将WifiManager扫描发现的新开放AP插入db

现在,MainClass应该在后台工作,在用户同意的情况下,即使应用程序关闭

我的问题是:

  • 我应该在新线程上还是在UI线程上执行MainClass
  • MainClass应该是异步任务、服务还是其他?也请告诉我为什么
  • 扫描操作返回在已注册接收器中执行的扫描。它是在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();
        }
    }   
    
    是在kill调用onStartCommand还是onCreate时启动

  • 我应该在新线程上还是在UI线程上执行MainClass
  • 回答: 您应该在后台线程(新线程)上执行,因为android不允许在UI线程上执行网络任务,如果您在UI线程上执行耗时操作,UI线程将冻结

  • MainClass应该是异步任务、服务还是其他?也请告诉我为什么
  • 回答: 正如您明确指出的,您的需求(MainClass应该在后台工作)您需要使用,因为即使您的应用程序被终止,服务也会在后台运行

  • 您应该在后台线程中使用MainClass.java。i、 例如,服务

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

  • 广播接收器将向MapActivity.java发送数据。注册接收者的onReceive()方法始终在UI线程中运行


  • 若你们想在前台运行MainClass.java,你们可以使用MVP模式。你应该把你的东西放到展示层

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

    回答得好,但更具体一点:我想他需要一个前台服务。因为即使应用程序关闭,它也必须运行。在Android doze模式下,没有其他选项可以完成此操作(据我所知)。@jobbert,有一个选项可以使用MVP模式完成此案例。@jobbert您是对的。如果OP不想让服务在操作系统的突发奇想下被终止,那么前台服务就是他们所需要的。那么,我应该使用service还是IntentService?如果我是对的:在UI线程上运行服务,但在中使用startForeground()时,服务会在新线程上运行吗?IntentService有自己的线程,所以它与我需要的线程非常相似?它们会被操作系统杀死吗?如果是,如何重新启动?啊,你需要一个在前台启动的正常服务。否则,Android将杀死后台的资源以防止电池丢失。当你想在后台得到一些大的东西而不是你现在需要的东西时,就使用意图服务。有了这些信息,您应该能够在Google/上搜索所有内容,从而使其正常工作@Silambarasan Ponguti,我不是说如何从服务中获取信息。