Вот моя основная деятельность:
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.
1 ответ
Может быть, немного поздно отвечать, но причина в том, что в функции обратного вызова handleMessage
есть опечатка. h
должен быть в нижнем регистре (см. здесь). Из-за этой опечатки обратный вызов handleMessage
никогда не вызывается.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.
@Override
в Java, такие ошибки могут быть обнаружены во время сборки.