Вот моя основная деятельность:

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.loop(), поскольку поток не получает сообщение, или, по крайней мере, я могу сказать, что обработчик потока не отправляет мне строку журнала отладки что он получил сообщение 0.

0
Thegremlin 22 Мар 2020 в 01:25

1 ответ

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

1
perflexed925 29 Апр 2020 в 20:53
1
Очень красивый улов!
 – 
chornge
30 Апр 2020 в 01:11
1
В качестве дополнительного примечания, если вы используете аннотацию @Override в Java, такие ошибки могут быть обнаружены во время сборки.
 – 
perflexed925
30 Апр 2020 в 21:06