Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信1)

简介: Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信)

1、先熟悉handler方式实现主线程和子线程互相通信方式,子线程和子线程的通信方式

     如果不熟悉或者忘记了,请参考我的这篇博客     Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信     http://blog.csdn.net/u011068702/article/details/75577005



2、贴上简单HandlerThread简单使用(主线程和子线程通信、子线程和子线程通信)的例子

1、activity_main.xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.handler.MainActivity1" >
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ParentToChile" />
    <Button
        android:layout_below="@+id/button1"
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ChileToParent" />
    <Button
        android:layout_below="@+id/button2"
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ChileToChile" />
</RelativeLayout>

2、MainActivity.java文件

package com.example.handler;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
  public static final String TAG = "HandlerTest";
  public HandlerThread mHandlerThread;
  public Handler mChileHandler;
  public Handler mHandlerCToP = new Handler(){
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      int id =  (int) Thread.currentThread().getId();
      Log.d(TAG, "mHandlerCToP currentThread id is:" + id);
    }
  };
  public Button mButtonPtoC;
  public Button mButtonCtoP;
  public Button mButtonCtoC;
  public Handler mHandler = new Handler();
  public Handler mHandlerCtoC = null;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    int id =  (int) Thread.currentThread().getId();
    Log.d(TAG, "onCreate currentThread id is:" + id);
    initUIAndThread();
  }
  public void initUIAndThread() {
    mHandlerThread = new HandlerThread("chenyu");
    mHandlerThread.start();
    mHandler = new Handler(mHandlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
              int id =  (int) Thread.currentThread().getId();
              Log.d(TAG, "initThread() mHandler handleMessage currentThread id is:" + id);
          switch(msg.what) {
          case 0:
            mHandlerCToP.post(new Runnable(){
              @Override
              public void run() {
                int id =  (int) Thread.currentThread().getId();
                      Log.d(TAG, "initThread() mHandlerCToP post currentThread id is:" + id);
                mButtonPtoC.setText("chenyu");
              }
            });
            break;
          case 1:
            mHandlerCToP.post(new Runnable(){
              @Override
              public void run() {
                int id =  (int) Thread.currentThread().getId();
                      Log.d(TAG, "initThread() mHandlerCToP post currentThread id is:" + id);
                mButtonCtoC.setText("chenyu");
              }
            });
          default:
            break;
          }
            }
        };
    mButtonPtoC = (Button)findViewById(R.id.button1);
    mButtonCtoP = (Button)findViewById(R.id.button2);
    mButtonCtoC = (Button)findViewById(R.id.button3);
    mButtonPtoC.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View v) {
        int id =  (int) Thread.currentThread().getId();
            Log.d(TAG, "mButtonPtoC currentThread id is:" + id);
        Log.d(TAG, "mHandlerPToc msg.what is 0");
        mHandler.sendEmptyMessage(0);
      }
    });
    mButtonCtoP.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View v) {
        int id =  (int) Thread.currentThread().getId();
              Log.d(TAG, "mButtonCtoP currentThread id is:" + id);
        Log.d(TAG, "mHandlerPToc msg.what is 0");
        mHandlerCToP.sendEmptyMessage(0);
      }
    });
    mButtonCtoC.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View v) {
        new Thread(new Runnable(){
          @Override
          public void run() {
            int id =  (int) Thread.currentThread().getId();
                  Log.d(TAG, "mButtonCtoC currentThread id is:" + id);
            Log.d(TAG, "mHandlerCToc msg.what is 1");
            mHandler.sendEmptyMessage(1);
          }
        }).start();
      }
    });
  }
   @Override
   protected void onDestroy() {
     super.onDestroy();
       mHandlerThread.quit();
   }    
}
相关文章
|
6月前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
233 1
|
6月前
|
消息中间件 安全 数据处理
Android为什么不能在子线程更新UI
Android为什么不能在子线程更新UI
75 0
|
存储 网络协议 物联网
Android集成MQTT教程:实现高效通信和实时消息传输
Android集成MQTT教程:实现高效通信和实时消息传输
1878 0
|
6月前
|
Android开发
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
1254 0
|
22天前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
37 2
|
26天前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
30 2
|
2月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
326 4
|
4月前
|
Java Android开发 Spring
Android Spingboot 实现SSE通信案例
【7月更文挑战第14天】以下是使用Android和Spring Boot实现SSE(Server-Sent Events)通信的案例摘要: 在`MainActivity`中: - 初始化界面元素并设置按钮点击事件。 - `startSseRequest`方法创建`WebClient`对象,设置请求头,发送请求,并处理响应和错误。 请确保将`your-server-url`替换为实际的服务器地址。
119 14
|
3月前
|
Android开发
Android项目架构设计问题之C与B通信如何解决
Android项目架构设计问题之C与B通信如何解决
18 0
|
3月前
|
移动开发 前端开发 weex
Android项目架构设计问题之模块化后调用式通信如何解决
Android项目架构设计问题之模块化后调用式通信如何解决
17 0
下一篇
无影云桌面