Android Handler,Loop,HandlerThread消息处理

博客标题也不知道写什么好,只是最近有时候发现Handler,Loop,HandlerThread很容易混淆,所以做了简单的笔记处理:

第一种 : 大概的意思给出说明图:

上面图中的模型,就平时很常见的当需要更新UI时,通过Handler发送一个Message事件出去,但是Message事件的路径是先入了主线程的MessageQueue队列(一般是FIFO模式)中,

然后Looper就像一个永恒的发动机一样,不断的"循环"的去查询MessageQueue队列中是否有Message消息,如果查询存在,就会然其出队列来处理,由于这个消息队列是共用主线程中的(这句话非常重要)MessageQueue,所以它可以更新UI显示或者做一些其他的事情,主要还是更新UI较多(在主线程中).


第二种:下面这一种其实更具有普遍性

为什么说更具有普遍性,其实可以想一想Activity其实也相当于一个线程对象/或者封装了线程对象,我看了mMainThread等里面的消息循环,大致这么理解的.将理论很难理解,

比如说,开发者要向一个对象依次按顺序发送N个消息,第N-a个消息不能够在N-a-1个消息未执行完成就开始,即保证前面一个消息执行完成了,才能够执行下一个消息,平时开发中这样的情况很常见,但是要注意,如果我们在Activity中新建一个Thread线程,那就相当于独立于主线程之外,所以在这个线程中不能够处理更新UI等事情,但是却可以做很多其他逻辑处理,而且它不会影响主线程的,它只会在它自己的线程中按着顺序一个一个的执行.


第三种: 还有一个HandlerThread,看了很多样例,既然在Thread单词前面加上Handler,就和Handler扯上了关系,但是这个我自己还需要研究研究它正真的机制,只知道这个东西新建以后,让其start,开发者做一些更新UI或者其他事情,系统会安排在后台"慢慢"的帮开发者完成,即使事情里面加了延时也不用当心,他不会去阻塞主线程的.


下面给出一个测试程序验证一下:

<1> : 新建一个Android工程:


<2> : DurianMainActivity.java

package com.durian.handlerthread;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
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 android.widget.Toast;

public class DurianMainActivity extends Activity {

    private final static String TAG = "DurianMainActivity";
    private TextView mTextView;
    private TextView mTextViewA;
    private TextView mTextViewB;
    private TextView mTextViewC;

    private Button mButton;
    private Button mButtonA;
    private Button mButtonB;
    private Button mButtonC;

    private HandlerThread mHandlerThread;
    private HandlerThread mHandlerThreadA;

    private Handler mUIHandler;
    private Handler mUIHandlerA = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);

            mNumCount++;
            mTextViewA.setText("mNumCount : " + mNumCount);

        }

    };
    
    private Handler mUIHandlerB=new Handler(){

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            mTextViewB.setText("Number : "+mNumber++);  
            
            Log.i(TAG,"Number : "+mNumber);
            
        }
        
    };
    
    private int mLooperNum=0;
    
    private class LooperThread extends Thread{

        public Handler mLooperHandler;
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            Looper.prepare();
            mLooperHandler=new Handler(){

                @Override
                public void handleMessage(Message msg) {
                    // TODO Auto-generated method stub
                    super.handleMessage(msg);

                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                    Log.i(TAG,"mLooperNum : "+mLooperNum++);
                    //here is not UI thread
//                    mTextViewC.setText("mLooperNum : "+mLooperNum);
                    
                }
                
            };
            
            Looper.loop();
            
        }

    }
    
    private LooperThread mLooperThread;

    private Handler mBackgroundHandler;
    private Handler mBackgroundHandlerA;

    private int mCount = 0;
    private int mNumCount = 0;
    private int mNumber=0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.durian_main);

        mTextView = (TextView) findViewById(R.id.durianview);
        mTextView.setText("ui count : " + mCount);

        mTextViewA = (TextView) findViewById(R.id.durianaview);
        
        mTextViewB = (TextView) findViewById(R.id.durianbview);
        
        mTextViewC=(TextView)findViewById(R.id.duriancview);
        
        mLooperThread=new LooperThread();
        mLooperThread.start();
        
        mButtonC=(Button)findViewById(R.id.buttonC);
        mButtonC.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Message msg=new Message();
                msg.what=1;
                mLooperThread.mLooperHandler.sendMessage(msg);
                                
            }
            
        });
        
        mButtonB=(Button)findViewById(R.id.buttonB);
        mButtonB.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new Thread(){

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        super.run();
                        Looper.prepare();
                        
                        Message msg=new Message();
                        msg.what=100;
                        mUIHandlerB.sendMessage(msg);
                        
                        Looper.loop();
                        
                    }
                    
                }.start();
            }
            
        });

        mButtonA = (Button) findViewById(R.id.buttonA);
        mButtonA.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                mBackgroundHandlerA.post(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        Message msg = new Message();
                        msg.what = 100;
                        mUIHandlerA.sendMessage(msg);

                    }

                });

            }

        });

        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                mBackgroundHandler.post(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub

                        for (int i = 0; i < 1; i++) {

                            mUIHandler.post(new Runnable() {

                                @Override
                                public void run() {
                                    // TODO Auto-generated method stub
                                    mCount++;
                                    try {
                                        Thread.sleep(500);
                                    } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    mTextView.setText("ui count : " + mCount);
                                    Log.i(TAG, "ui count : " + mCount);

                                }

                            });

                        }

                    }

                });

            }

        });

        mHandlerThread = new HandlerThread("backgroun_thread_post");
        mHandlerThread.start();

        mHandlerThreadA = new HandlerThread("backgroun_thread_send");
        mHandlerThreadA.start();

        mBackgroundHandler = new Handler(mHandlerThread.getLooper());

        mBackgroundHandlerA = new Handler(mHandlerThreadA.getLooper());

        mUIHandler = new Handler();

    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

        mHandlerThread.getLooper().quit();

    }

}

durian_main.xml

<LinearLayout 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:orientation="vertical"
    tools:context=".DurianMainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/durianview"
        android:text="@string/hello_world" />
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start"
        android:id="@+id/button"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/durianaview"
        android:text="@string/hello_world" />
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="startA"
        android:id="@+id/buttonA"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/durianbview"
        android:text="@string/hello_world" />
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="startB"
        android:id="@+id/buttonB"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/duriancview"
        android:text="@string/hello_world" />
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="startC"
        android:id="@+id/buttonC"/>

</LinearLayout>

程序很简答,运行点击对应的按钮,就可以测试上面的结论了.

另外看一下按钮StartB和StartC两个的区别,哪一个会产生并线操作的问题,哪个才是真正合理的.















深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值