【发布时间】:2023-04-08 16:08:01
【问题描述】:
我创建了一个服务类和一个工作类,它们在单独的线程中执行。我想在它们之间建立通信,以便工作人员可以将一些状态发送回服务。
我尝试将我的工作人员 Thread 转换为 HandlerThread 并在服务端设置一个 Handler,但是我不知道如何实际从工作人员发送消息。好像没搞懂这个概念。
这是我的课程(没有通信逻辑):
服务类
package com.example.app;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class ConnectionService extends Service {
protected ConnectionWorker thread;
@Override
public void onCreate() {
super.onCreate();
// Creating a connection worker thread instance.
// Not starting it yet.
this.thread = new ConnectionWorker();
Log.d(this.getClass().getName(), "Service created");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(this.getClass().getName(), "Service started");
// Checking if worker thread is already running.
if (!this.thread.isAlive()) {
Log.d(this.getClass().getName(), "Starting working thread");
// Starting the worker thread.
this.thread.start();
}
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Log.d(this.getClass().getName(), "Stopping thread");
// Stopping the thread.
this.thread.interrupt();
Log.d(this.getClass().getName(), "Stopping service");
super.onDestroy();
Log.d(this.getClass().getName(), "Service destroyed");
}
}
工人阶级
package com.example.app;
import android.os.SystemClock;
import android.util.Log;
public class ConnectionWorker extends Thread {
public ConnectionWorker() {
super(ConnectionWorker.class.getName());
}
@Override
public void run() {
super.run();
Log.d(this.getClass().getName(), "Thread started");
// Doing the work indefinitely.
while (true) {
if (this.isInterrupted()) {
// Terminating this method when thread is interrupted.
return;
}
// @todo: send a message to the service
Log.d(this.getClass().getName(), "Doing some work for 3 seconds...");
SystemClock.sleep(3 * 1000);
}
}
}
如何实现HandlerThread,从工作线程发送消息并在我的服务中接收它们?
我将非常感谢一个代码示例。
更新
实际上,我似乎不能在我的线程内使用Looper,因为它会阻塞线程执行,我不希望这样。是否可以在不使用Looper的情况下从线程发送消息?
【问题讨论】:
-
能否请您提示您希望如何处理“在您的服务中”收到的消息。严格来说你不能向你的服务发送消息,你可以向一个线程循环器发送消息,如果你的服务这将是主线程循环器。
-
@Okas,感谢您的回复。我将在其中一个片段中显示来自工作人员的一些状态信息。
-
那么您不想向服务发送消息。你要做的是从后台线程更新 ui,事实上这个线程是由服务启动的并不重要。看看这个例子developer.android.com/training/multiple-threads/…
-
我不知道你是否知道,但是服务在你的活动、片段、广播接收器、视图运行的线程上运行,所以如果你想更新一些东西,请在处理程序上使用 post(runnable)并直接在那里调用您的更新,它对您来说足够食用吗?
-
感谢您的建议@Elitz。我只是很难弄清楚如何正确实现这个
HandlerThread。据我了解,Handler应该在接收方,就我而言,在服务中。我可以在那里实现它,但我不确定如何实际将消息从线程发送到它。线程与服务通信的示例将非常有帮助。
标签: java android multithreading android-service