我认为这可能是重复但我无法找到任何可以回答我问题的内容。我知道服务在应用程序的同一个线程中工作。我想从服务中运行一些任务,但是在另一个线程中。 我有几点我必须连续跟踪gps,每当我到达这一点时,我必须做一些其他任务(非常快的)。为此,我使用BroadcastReceiver。一切都很完美,但现在我想把所有这些都放在一个不同的线程中。我怎样才能做到这一点?我的意思是我尝试了但是我一直得到错误"无法在没有调用Looper.prepare()"的线程内创建处理程序。我查找了一些修复,但它们似乎都不适合或者是正确的编程方式(其中很少看起来像修复但是以一种非常糟糕的方式)。 我将发布一些代码,以便您可以将其与您的解决方案集成。提前感谢您的帮助。
public class MyService extends Service {
private final IBinder mBinder = new MyBinder();
...
@Override
public void onCreate() {
...
}
@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}
public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
....
(my tasks)
....
return(START_REDELIVER_INTENT);
}
............
(final method that calls stopSelf() after it's done)
............
@Override
public void onDestroy() {
Log.i("onDestroy", "Service stop");
super.onDestroy();
}
}
答案 0 :(得分:2)
这样做的简单和最好的方法是使用IntentService和基类而不是Service。
public class MyService extends IntentService {
public MyService(String name) {
super("");
}
@Override
protected void onHandleIntent(Intent intent) {
/*
* Do Your task here, service will automatically stop as your task
* complete. And your task will run in worker thread rather main thread.
* Everything will handled by IntentService.
*/
}
}
您可以找到完整的IntenetService演示Here
答案 1 :(得分:2)
您可以将服务设为separate process
。然后它将在自己的process
中运行。为此,只需在process attribute
中添加Android Manifest
。
<service
android:name="<serviceName>"
android:process=":<processName>" />
别忘了在进程名称
之前添加:
答案 2 :(得分:0)
IntentService类提供了一个简单的结构,用于在单个后台线程上运行操作。这使它能够处理长时间运行的操作,而不会影响用户界面的响应能力。此外,IntentService不受大多数用户界面生命周期事件的影响,因此它会在关闭AsyncTask的情况下继续运行
IntentService有一些限制:
它无法直接与您的用户界面进行交互。要将结果放在UI中,您必须将它们发送到活动。 工作请求按顺序运行。如果某个操作在IntentService中运行,并且您向其发送另一个请求,则该请求将一直等到第一个操作完成。 在IntentService上运行的操作不能被中断。
有关详细信息和示例,请参阅文档: https://developer.android.com/training/run-background-service/create-service.html
示例src代码:https://developer.android.com/shareables/training/ThreadSample.zip