android开发之Handler的使用

1.常见使用,在线程中处理一些逻辑,处理完毕后将需要的数据发回给主线程,让主线程对UI进行修改。

package com.lintao.handledemo;

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

/**
 * 通过线程修改UI
 * @author admin
 *
 */
public class MainActivity extends Activity {

    private TextView mTvHandlerDemo;

    private Handler myHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTvHandlerDemo = (TextView)findViewById(R.id.tv_handler_demo);

        //实例化一个Handler
        myHandler = new MyHandler();
        //实例化一个Runnable接口
        MyThread m = new MyThread();
        //启动该接口
        new Thread(m).start();
    }

    /**
     * 接受消息并处理消息 ,此Handler会与当前主线程一块运行,可以用来改变UI等
     */
    class MyHandler extends Handler {
        // 子类必须重写此方法,接受数据
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            // 此处可以更新UI
            Bundle b = msg.getData();
            String color = b.getString("text");
            MainActivity.this.mTvHandlerDemo.setText(color);
        }
    }

    /**
     * 这里就可以用来处理主线程以后的工作,等完成后可以发送信息给主线程
     * @author admin
     *
     */
    class MyThread implements Runnable {
        public void run() {
            //隔了10s
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //构造Message
            Message msg = new Message();
            Bundle b = new Bundle();// 存放数据
              b.putString("text", "改变UI");
            msg.setData(b);

            //发送信息
            MainActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI

        }
    }

}

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.lintao.handledemo.MainActivity$PlaceholderFragment" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:id="@+id/tv_handler_demo" />

</RelativeLayout>

2.有时候可能需要延时去做一些事情,但并不涉及到复杂的操作的,可以使用下面两种方法

final boolean sendMessageDelayed(Message msg,long delayMillis);

final boolean sendEmptyMessageDelayed(int what,long delayMillis);

时间: 2024-10-02 14:31:07

android开发之Handler的使用的相关文章

Android开发之Handler和Looper的关系

关于Handler的总结. Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等. MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行.当然,存放Message并非实际意义的保存,而

Android开发之Handler的使用方法(源代码分享)

Handler主要接受子线程发送的数据, 并用此数据配合主线程更新UI.. 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发.比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.  如果此时需要一个耗时的操作,例如: 联网读取数据或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到An

Android开发之Handler的用法(源码分享)

Handler主要接受子线程发送的数据, 并用此数据配合主线程更新UI.. 当应用程序启动时.Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发. 比方说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.  假设此时须要一个耗时的操作,比如: 联网读取数据或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,假设你放在主线程中的话,界面会出现假死现象, 假设5秒钟还没有完毕的话,.会收到A

Android开发之Handler+HttpClient请求解析数据

读取字符流封装类 package com.fan.listview_show.utils; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class StreamUtils { public static String streamUtils(InputStream inputStream) throws Exception{ ByteArrayOutputStream byteArrayOutp

Android开发之bindService()侦听service内部状态

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之assets目录下资源使用总结

预前知识: Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可: 第二种是assets目录下存放的原生资源文件: 因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们.那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.ap

Android开发之UI更新交互机制与实例解析

android开发过程中,经常需要更新UI的状态和文案等.这是就需要对UI进行 更新.在android中更新UI一般有三种方法,handler机制.RunOnUiThread方法以及AsyncTask异步类方法等 本文下面就这三种方法进行了演示和代码实现. a.Handler机制通过使用消息机制来实现 b.RunOnUiThread方法是通过运行UI线程来达到更新UI的目的 c.AsyncTask是异步类,通过异步更新来更新UI 效果图如下:           (1)Java功能实现代码如下:

Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View

最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面布局实现如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&

Android开发之”再按一次退出程序“的实现

现在移动客户端退出程序对话框退出越来越不流行了,都开始使用连续按两次来退出,即著名的“再按一次退出程序”模式.现在就看看怎么实现的吧. @SuppressLint("HandlerLeak") Handler handler = new Handler(){ public void handleMessage(Message msg){ switch (msg.what) { } } }; boolean willExit = false; @Override public void