Android最好使用AsyncTask,Service或其他

时间:2017-05-20 11:40:00

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

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

MapActivity:

显示包含用户位置的地图并在范围内打开接入点。 用户和AP的位置应由“MainClass”接收。

MainClass:

这应该做主要工作。它应该获得用户位置,从db获取开放访问点并插入使用WifiManager扫描找到的db new open AP。

现在,即使应用程序已关闭,MainClass也应该在后台工作,用户同意。

我的问题是:

  1. 我应该在新线程或UI线程上执行MainClass操作吗?
  2. MainClass应该是AsyncTask,Service还是其他?请告诉我为什么。
  3. 扫描操作返回在注册的接收器中执行的扫描。它是在UI线程上运行还是在新线程上运行?
  4. 提前致谢。

    UPDATE;

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

    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();
        }
    }   
    

    在killStartCommand或onCreate上执行START_STICKY?

3 个答案:

答案 0 :(得分:0)

  
      
  1. 我应该在新线程或UI线程上执行MainClass内容吗?
  2.   

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

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

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

答案 1 :(得分:0)

  1. 您应该将MainClass.java内容用于后台线程。即服务

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

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

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

答案 2 :(得分:0)

后台服务将是我猜的最佳和唯一的解决方案。因为即使应用程序关闭,您也希望自己的操作继续运行。