1

我编写了一个测试应用程序来了解线程之间的通信机制。

我的消息来源:

http://techtej.blogspot.de/2011/02/android-passing-data-between-main.html向正在监听网络数据的线程发送消息

我不明白如何使用 Handler 和 Looper。

这里:(每一步都应该给出他的状态:Log.v(TAG, "..."))

  • MainActivity 创建并启动 Thread (Runnable "r")
  • MainActivity --> 消息到 --> r
  • MainActivity <-- 修改消息 <-- r

    

package com.example.desktop.testhandlerlooper; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { private static final String TAG = "MyActivity"; private Handler mHandler2; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { Log.v(TAG, (String)msg.obj); } }; mHandler.post(r); } @Override protected void onStart() { super.onStart(); for(int i = 10; i>=0; i--) { Message msg = mHandler2.obtainMessage(); msg.arg1 = 3; msg.obj = String.valueOf(i); mHandler2.sendMessage(msg); } } Runnable r = new Runnable() { private static final String TAG = "Thread"; @Override public void run() { Log.v(TAG, "Before the looper"); Looper.prepare(); //======================================= mHandler2 = new Handler() { public void handleMessage(Message msg) { synchronized (this) { Message m = mHandler.obtainMessage(); //Message message = Message.obtain(); m.obj = "ACK:" + msg.obj; Log.v(TAG, (String)m.obj); //message.sendToTarget(); mHandler.sendMessage(msg); } } }; //======================================= Looper.loop(); Log.v(TAG, "After the looper"); } }; }

日志猫:

--------- 崩溃开始 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.desktop.testhandlerlooper, PID: 2872 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.desktop .testhandlerlooper/com.example.desktop.testhandlerlooper.MainActivity}:java.lang.NullPointerException:尝试在 android.app 的空对象引用上调用虚拟方法 'android.os.Message android.os.Handler.obtainMessage()' .ActivityThread.performLaunchActivity(ActivityThread.java:2416) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage (活动线程.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 的 lang.reflect.Method.invoke(Native Method) ) 引起:java.lang.NullPointerException:尝试在 com.example.desktop.testhandlerlooper.MainActivity.onStart(MainActivity .java:35) 在 android.app.Instrumentation。callActivityOnStart(Instrumentation.java:1237) 在 android.app.Activity.performStart(Activity.java:6253) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java :2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com。com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 处的 android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 应用程序终止。

除了我正在尝试做的事情之外,我了解错误但不知道如何解决它。也许 MainThread 和 ChildTread 两者之间的同步?

4

1 回答 1

0

您正在尝试在初始化之前使用 mHandler2 变量,如您在日志行中所见:com.example.desktop.testhandlerlooper.MainActivity.onStart(MainActivity.java:35)

您应该首先声明和初始化变量,然后开始使用它们。

于 2020-03-17T08:23:19.797 回答