Отправка сообщения на messageQueue в HandlerThread
Я учусь, как использовать handlerthread. Я сослался на несколько учебных пособий в Интернете, но, к сожалению, почти все они предоставили объяснение теории без краткого и простого примера.
В приведенном ниже коде я просто хочу отправить сообщение обработчику HandlerThread, и я хочу, чтобы это значение было обработано в handleMessage() класса HandlerThread.
Что происходит, запускается ниже JobSchedulerService01, вызывается onStartJob, все три метода:
prepareLooper()
onLooperPrepared()
sendMessage()
вызываются, но нет журналов из метода handleMessage(), более того, jobFinished() никогда не вызывается.
пожалуйста, дайте мне знать, как правильно использовать HandlerThread для достижения вышеупомянутой задачи.
код
public class JobSchedulerService01 extends JobService {
private final static String TAG = JobSchedulerService01.class.getSimpleName();
public final static String ACTION_JOB_SCHEDULER_01 = "action_start_job_01";
private JobParameters jobParameters = null;
private MyHandlerThread mMyHandlerThread = null;
@Override
public boolean onStartJob(JobParameters params) {
Log.w(TAG, "onStartJob");
this.setJobParameters(params);
int jobID = params.getJobId();
Toast.makeText(this, "JobID: " + jobID + "JobName: " + TAG, Toast.LENGTH_SHORT).show();
Log.i(TAG, "JobID: " + jobID + " JobName: " + TAG );
this.mMyHandlerThread = new MyHandlerThread(params.toString());
this.mMyHandlerThread.start();
this.mMyHandlerThread.prepareLooper();
this.mMyHandlerThread.sendMessage(20);
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.w(TAG, "onStopJob");
return false;
}
private class MyHandlerThread extends HandlerThread {
private Handler mHandler = null;
public MyHandlerThread(String name) {
super(name);
Log.i(TAG, "MyHandlerThread: " + name + "started.." );
}
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
Log.w(TAG, "onLooperPrepared called");
mHandler = new Handler(this.getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int maxIteration = msg.getData().getInt("what");
Log.v(TAG, mHandler.getClass() + "MaxIteration: " + maxIteration);
for (int i = 0; i <= maxIteration; i++) {
Log.i(TAG, "Job: " + getJobParameters().toString() + " publishes: " + i);
try {
Thread.sleep(1 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
jobFinished(getJobParameters(), false);
}
};
}
public void prepareLooper() {
Log.w(TAG, "prepareLooper called");
this.mHandler = new Handler(this.getLooper());
}
public void sendMessage(int val) {
Log.w(TAG, "sendMessage called");
Log.w(TAG, "this.mHandler initialized: " + this.mHandler);
Bundle bundle = new Bundle();
bundle.putInt("what", val);
Message msg = this.mHandler.obtainMessage();
msg.setData(bundle);
this.mHandler.sendMessage(msg);
}
}
public void setJobParameters(JobParameters jobParameters) {
this.jobParameters = jobParameters;
}
public JobParameters getJobParameters() {
return this.jobParameters;
}
}
журналы:
.servicewithid_01 W/JobSchedulerService01: onStartJob
.servicewithid_01 I/JobSchedulerService01: JobID: 1 JobName: JobSchedulerService01
.servicewithid_01 I/JobSchedulerService01: MyHandlerThread: android.app.job.JobParameters@1028756started..
.servicewithid_01 W/JobSchedulerService01: prepareLooper called
.servicewithid_01 W/JobSchedulerService01: sendMessage called this.mHandler initialized: Handler (android.os.Handler) {5d403d7}
.servicewithid_01 W/JobSchedulerService01: onLooperPrepared called