【问题标题】:How do I keep the Thread of an IntentService alive?如何使 IntentService 的线程保持活动状态?
【发布时间】:2018-04-25 23:05:49
【问题描述】:

我正在编写一个跟踪用户位置的测试应用程序。这个想法是我可以启动一个服务,然后注册位置更新。目前我正在为此使用 IntentService。

服务代码(不起作用...)如下所示:

public class GpsGatheringService extends IntentService {

// vars
private static final String TAG = "GpsGatheringService";
private boolean stopThread;

// constructors
public GpsGatheringService() {
    super("GpsGatheringServiceThread");
    stopThread = false;
}

// methods
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand()");
    return super.onStartCommand(intent, flags, startId);
}

@Override
protected void onHandleIntent(Intent arg0) {
    // this is running in a dedicated thread
    Log.d(TAG, "onHandleIntent()");
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    LocationListener locationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged()");
        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.d(TAG, "onProviderEnabled()");
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.d(TAG, "onProviderDisabled()");
        }

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged()");
        }
    };
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

    while (!stopThread) {
        try {
            Log.d(TAG, "Going to sleep...");
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy()");
    stopThread = true;
}

}

目前唯一发生的是“Going to sleep...”的输出。我需要一些机制来保持线程处于活动状态(因为否则侦听器无法再访问状态更新)并且不会浪费 cpu 时间(我认为忙循环不是首选方式)。 即使有很多其他方法可以实现应用程序行为(记录 gps 坐标),我也对这种方式的解决方案感兴趣,以学习解决此类问题的技术!

【问题讨论】:

  • 你为什么不使用服务而不是 IntentService

标签: android multithreading intentservice


【解决方案1】:

如何让 IntentService 的线程保持活动状态?

你没有。在这种情况下,您不要使用IntentService

我需要一些机制来保持线程处于活动状态(因为否则侦听器无法再访问状态更新)并且不会浪费 cpu 时间(我认为忙循环不是首选方式)

不,在这种情况下 Service 很好,因为您可以控制服务何时消失,您可以控制您创建的任何线程的生命周期等。IntentService 不适合您的预期目的,因为 it 控制服务何时停止,it 控制线程的生命周期。

【讨论】:

  • 您可能会说 IntentService 适合同步后台处理,但您需要使用 Service 或其他东西来进行异步处理。也就是说,如果你调用的东西有回调,不要使用 IntentService。
  • 所以如果他想在他的 IntentService 中放置循环,那将是一个不好的做法@CommonsWare?我明白了,所以我们应该只创建 Service 而不是 IntentService 对吗? :D
  • @gumuruh:“所以如果他想在他的 IntentService 中放置循环,那将是一个不好的做法”——恕我直言,是的。将常规的Service 与您自己的后台线程一起使用,您可以在其中定义自己的规则,用于服务何时关闭、如果在线程已经运行时收到命令该怎么办等。
  • 我明白了。但是,如果我使用公共线程并绑定到处理程序 @CommonsWare 会有什么不同?
  • @CommonsWare 在您完成的总项目中,您使用 IntentService 与服务的百分比是多少?您在大多数情况下使用服务吗?是 20/80 吗?
【解决方案2】:

考虑使用remote service。它对我有用。

【讨论】:

  • 我相信远程服务运行在一个单独的进程上,而不是线程上。我在远程服务的Handler 中使用Thread.sleep 调用对其进行了测试,整个应用程序在服务休眠时挂起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多