【问题标题】:Sample of handler not working for some reason处理程序示例由于某种原因无法正常工作
【发布时间】:2020-07-02 18:13:39
【问题描述】:

这是我的主要活动:

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 的调试日志行。

【问题讨论】:

    标签: android multithreading handler looper


    【解决方案1】:

    也许回答有点晚了,但原因是handleMessage 回调函数中有错字。 h 应该是小写的(参见here)。由于这个错字,handleMessage 回调永远不会被调用。

    【讨论】:

    • 非常好的收获!
    • 另外说明,如果在 Java 中使用 @Override 注释,则可以在构建时本身捕获此类错误。
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多