Android 再谈handler

今天在做http网络事件的响应网络接收处理一般不能放在主线程中使用,目前也只会使用AsyncTask进行处理!之前虽然写过handler处理的一些文章但是发现全不会了!无奈~

关于handler某位兄弟已经整理的很透彻了!现在引用下原话如下:

Handler监听者框架:子线程是事件源,主线程是监听者。
Handler作为子线程的监听器出现:主线程中生成Handler的子类,并重写handleMessage(Message msg) 方法,用来对子线程响应。子线程调用Hanlder的sendMessage(message)发送事件。

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

    private final static String TAG = "ThreadTest";
    TextView myTv = null;
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myTv = (TextView) this.findViewById(R.id.tv1);
        // 执行该线程
        new Thread(runnable).start();
    }
    /**
     * 主线程监听者
     */
    Handler myHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            Log.i(TAG, "begin--->handleMessage");
            if (msg.what == 0x000001) {
                myTv.setText(String.valueOf(i));
            }
            Log.i(TAG, "end--->handleMessage");
            super.handleMessage(msg);
        };
    };

    /**
     * 子线程事件源
     */
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                i++;
                Message msg = new Message();
                msg.what = 0x000001;
                Log.i(TAG, "begin--->sendMessage");
                myHandler.sendMessage(msg);
                Log.i(TAG, "end--->sendMessage");
                Log.i(TAG, "begin--->dosomething");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.i(TAG, "end--->dosomething");
            }
        }
    };

}

打印下输出:发现它并不是等dosomething执行完毕之后再调用handlemessage事件,而是一旦调用sendmessage后就会执行handlemessage。

Handler钩子方式:在主线程中生成一个Hanlder,用Handler的Post(Runnable)方法可以将Runnable钩到主线程中运行。

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

    private final static String TAG = "ThreadTest";
    TextView myTv = null;
    //handler在主线程中创建,调用post的时候钩子会把它钩回主线程
    Handler  myHandler = new Handler();
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myTv = (TextView) this.findViewById(R.id.tv1);
        new Thread(runnable1).start();
    }

    /**
     * 子线程
     */
    Runnable runnable1 = new Runnable() {
        @Override
        public void run() {
            while (true) {
                i++;
                myHandler.post(runnable2);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };

    /**
     * 使用钩子将该子线程钩到主线程中
     */
    Runnable runnable2 = new Runnable() {
        @Override
        public void run() {
            myTv.setText(String.valueOf(i));
        }
    };

}

Android 再谈handler,布布扣,bubuko.com

时间: 2024-10-27 04:03:28

Android 再谈handler的相关文章

OpenglES2.0 for Android:再谈纹理映射

OpenglES2.0 for Android:再谈纹理映射 前言 上一节我们实现了一个简单的纹理映射的例子--一个简单的贴图,这节我们来做一些稍微复杂一点的例子,最后再给我们前面的立方体做一个纹理. 纹理拉伸 重复拉伸方式 这种是经常使用的一张纹理拉伸方式,常用于绘制一些重复的元素,比如我们在游戏绘制一幅方格式的地图时.使用重复拉伸方式使得纹理能够根据目标平 面的大小自动重复,这样既不会失去纹理图的效果,也可以节省内存.如下图所示: 实现起来很简单,我们回到上节的项目,找到我们纹理的工具类Te

再谈Unity调用Android的Activity

这段时间在研究Unity4.3开发环境下,如何调用由Android SDK4.4.2写的Activity.参考了很多网上的博客,百度出了几十篇大部分都是转载雨松MOMO的,这里必须向雨松MOMO表示敬意!但雨松MOMO写的博客太旧了,不少内容已经过时,我严格按他说的步骤进行,还是出了问题,所以本博客就是告诉大家在Unity4.3+Android SDK4.4.2环境,起动Activity的细节. 我这篇博客不会从零讲起,所以首先给出两个重要的链接,大家应该看一下: 第一个是雨松MOMO的  ht

深入探讨Android异步精髓Handler

深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Dra

Android中的Handler, Looper, MessageQueue和Thread

Android中的Handler, Looper, MessageQueue和Thread 前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些低级错误. 对于这部分的内容,将分成4小节来描述: 1.职责与关系 2.消息循环 3.线程与更新 4.几点小结 ------------------------------------------------

Android:使用Handler在线程之间通信

概述 假设一个情景,在一个应用程序中,要完成一个比较复杂.耗时较长的计算任务,如果将这个任务直接在主线程中开始,那么用户界面就会停止对用户操作的响应,而去解决这个计算任务,直到任务完成. 显然,这不是我们想要的结果.那么就需要用到多线程来解决这个问题. 但是新的问题又出现了,在C#和Android中,子线程是不能直接修改用户界面的数据的.也就是说,子线程计算出的结果,不能直接在子线程中让它显示在用户界面上.那么就需要把数据首先传递给主线程,让主线程去修改用户界面. Handler就是为了解决这个

Android中关于Handler的若干思考

在之前的博文中,讲过一些和Handler有关的知识,例如: Android 多线程----AsyncTask异步任务详解 Android多线程----异步消息处理机制之Handler详解 今天再把Handler的知识回顾总结一下. 本文包括与Handler有关的以下问题: (1)Handler的作用 (2)为什么Android中要设计为只能在UI线程中去更新UI呢? (3)Handler的两个异常 (4)Handler.Looper MessageQueue之间的关系(源码角度) (5)跟线程相

android 消息系统Handler、MessageQueue、Looper源码学习

android消息系统 整体框架如图所示 在安卓的消息系统中,每个线程有一个Looper,Looper中有一个MessageQueue,Handler向这个队列中投递Message,Looper循环拿出Message再交由Handler处理.整体是一个生产者消费者模式,这四部分也就构成了android的消息系统. 先来看一个最简单的例子 //这段代码在某个Activity的onCreate中 Handler handler = new Handler(Looper.getMainLooper()

深入源码解析Android中的Handler,Message,MessageQueue,Looper

本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文< Android中Handler的使用>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功能.但

Android学习笔记--Handler用法总结

转自:一叶知秋的博客 http://blog.sina.com.cn/s/blog_77c6324101016jp8.html 一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如 (1) 可以用handler发送一个message,然后在handler的线程中来接收.处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,Android提供了Handler作为主线程和子线程的纽带: (2) 也可以