处理程序因某种原因无法工作的样本

问题描述 投票:0回答:1

这是我的主要活动。

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个回答
1
投票

也许回答的有点晚了,但原因是在 handleMessage 回调函数。该 h 应为小写(见 此处). 由于这个错别字的原因, handleMessage 回调从未被调用。

© www.soinside.com 2019 - 2024. All rights reserved.