Обработчик / Looper / отправить сообщение в тему

Я написал тестовое приложение, чтобы понять механизм связи между потоками.

мои источники:

http://techtej.blogspot.de/2011/02/android-passing-data-between-main.html, отправьте сообщение в поток, который прослушивает данные из сети

Я не понимаю, как использовать Handler и Looper.

Здесь: (каждый шаг должен давать свое состояние: Log.v (TAG, "..."))

  • MainActivity создать и запустить поток (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"); } }; }

Logcat:

--------- начало сбоя E/AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.desktop.testhandlerlooper, PID: 2872 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo{com.example.desktop.testhandlerlooper/com.example.desktop.testhandlerlooper.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.os.Message android.os.Handler.obtainMessage()' для ссылки на пустой объект в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) в 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(собственный метод) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.os.Message android.os.Handler.obtainMessage () 'для ссылки на пустой объект на 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(собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArg sCaller.run (ZygoteInit.java:726) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) Приложение завершено.

Помимо того, что я пытаюсь сделать, я понимаю ошибку, но не знаю, как ее исправить. Может быть, синхронизация между, MainThread и ChildTread?

0 ответов

Вы пытаетесь использовать переменную mHandler2 перед инициализацией, как вы можете видеть в строке журнала по адресу: com.example.desktop.testhandlerlooper.MainActivity.onStart(MainActivity.java:35)

вы должны сначала объявить и инициализировать переменные, а затем начать их использовать.

Другие вопросы по тегам