Образец обработчика по какой-то причине не работает - PullRequest
0 голосов
/ 22 марта 2020

Вот мое основное занятие:

package com.eddieharari.threadtest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import java.util.logging.Logger;

public class MainActivity extends AppCompatActivity {
    counter MyCounter = new counter("MyCounter");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView txt = findViewById(R.id.textView);
        Button button = findViewById(R.id.button);
        Button skipButton = findViewById(R.id.button2);

         button.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 Log.d("threadtest","Button Was Cliecked");
                 MyCounter.start();

             }
         });

         skipButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                if (MyCounter.myHandler != null) {
                    Log.d("threadtest","Sending message to thread");
                    Message msg = MyCounter.myHandler.obtainMessage();
                    MyCounter.myHandler.sendMessage(msg);
                }
             }
         });


    }
}

В основном 2 кнопки, одна для запуска потока, а другая для отправки сообщения этой теме. Вот класс потока:

    package com.eddieharari.threadtest;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;

import androidx.annotation.NonNull;



public class counter extends Thread {
    public Handler myHandler;
    int mCounter;
    int mJumps;

    public counter(@NonNull String name) {
        super(name);
        mCounter = 0;
        mJumps = 1;

        }

    @SuppressLint("HandlerLeak")
    @Override
    public void run() {
        super.run();
        Log.d("thradtest","Thread had started!");
        Looper.prepare();

        myHandler=new Handler(){

            public void HandleMessage(Message m) {
                Log.d("threadtest","Inside Handler");
                if (m.what == 0) {
                    Log.d("threadtest","Got Message 0");
                }
            }
        };

        Looper.loop();

    }
}

Когда я запускаю этот пример, поток запускается, однако я не уверен, что именно делает Looper.l oop (), поскольку поток не получает сообщение, или, по крайней мере, я могу сказать, что обработчик потока не отправив мне строку журнала отладки, чтобы он получил сообщение 0.

1 Ответ

0 голосов
/ 29 апреля 2020

Возможно, немного поздно ответить, но причина в том, что в функции обратного вызова handleMessage есть опечатка. h должен быть в нижнем регистре (см. здесь ). Из-за этой опечатки обратный вызов handleMessage никогда не вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...