Отправка сообщения на 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

0 ответов

Другие вопросы по тегам