android中的handler使用之三

我们知道,handler可以可以发送Runnable的消息,同时他也可以发送Message的消息。代码如下

xml代码

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.example.android_handler.MainActivity" >
10
11     <TextView
12         android:id="@+id/textview"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:text="@string/hello_world" />
16
17 </RelativeLayout>

java代码

 1 package com.example.android_handler;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.os.Message;
 7 import android.widget.TextView;
 8
 9 public class MainActivity extends Activity {
10     private TextView textview = null;
11     private Handler handler = new Handler(){
12         public void handleMessage(android.os.Message msg) {
13             textview.setText("" +msg.obj);
14         };
15     };
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20         textview = (TextView) findViewById(R.id.textview);
21         new Thread(){
22             public void run() {
23                 //这个方法可以回收系统中已经存在的message
24                 Message message = Message.obtain();
25                 /*
26                  * 这个也是
27                  * Message message = handler.obtainMessage
28                  */
29
30
31                 //obj可以用于传递多种对象
32                 message.obj = "123";
33                 handler.sendMessage(message);
34             };
35         }.start();
36     }
37 }

同时,前面我们知道,利用handler可以在一个imageview中实现图片的轮播,但是如果我们想要让图片轮播结束,主要是运用handler, 因为handler不仅可以发送一个消息,而且还可以移除一个消息。代码如下

xml代码

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context="com.example.android_handler1.MainActivity" >
 7     <ImageView
 8        android:id="@+id/imageview"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         />
12     <Button
13         android:id="@+id/button"
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:text="@string/button_string"
17         />
18
19 </LinearLayout>

java代码

 1 package com.example.android_handler1;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.util.Log;
 7 import android.view.View;
 8 import android.view.View.OnClickListener;
 9 import android.widget.Button;
10 import android.widget.ImageView;
11
12 public class MainActivity extends Activity implements OnClickListener {
13     private Handler handler = new Handler();
14     private ImageView imageview = null;
15     private MyRunnable runnable = new MyRunnable();
16     private Button button = null;
17     //创建图片数组
18     private int images[]={R.drawable.image1, R.drawable.image2,R.drawable.image3};
19     //创建一个索引 用于记录当前图片的下标
20     private int index = 0;
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25         imageview = (ImageView) findViewById(R.id.imageview);
26         button = (Button) findViewById(R.id.button);
27         button.setOnClickListener(this);
28         new Thread(){
29             public void run() {
30                 //第一个参数是传入一个Runnable的对象
31                 //第二个参数表示的意思是每张图片显示的时间
32                 handler.postDelayed(runnable, 1000);
33             };
34         }.start();
35
36
37     }
38     //创建一个MYRunnable类, 用于操作imagevie上的图片
39     class MyRunnable implements Runnable
40     {
41
42         public void run() {
43             index++;
44             index = index % 3;
45             imageview.setImageResource(images[index]);
46             handler.postDelayed(runnable, 1000);
47         }
48
49     }
50     public void onClick(View v) {
51         //利用handler移除runnable,实现停止图片的轮播
52         handler.removeCallbacks(runnable);
53
54     }
55 }
时间: 2024-12-22 18:10:27

android中的handler使用之三的相关文章

Android中的Handler, Looper, MessageQueue和Thread

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

Android中的Handler

当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放在Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序就会挂掉.Handler就是把这些功能放到一个当初的线程里执行,与Activity互不影响. 一.Handler的定义:  Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中来接收.处理该消

Android中使用Handler造成内存泄露的分析和解决

什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向,则该对象会在被GC发现的时候被回收:另外,如果一组对象中只包含互相的引用,而没有来自它们外部的引用(例如有两个对象A和B互相持有引用,但没有任何外部对象持有指向A或B的引用),这仍然属于不可到达,同样会被GC回收. Android中使用Handler造成内存泄露的原因 Handler mHand

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

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

android中的Handler和Runnable

最近在做一个项目,在网络请求时考虑用Handler进行处理,然后就研究了一下Handler和Runnable 首先在看一下java中的Runnable The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. The class must define a method of no arguments called run.

Android中利用Handler实现消息的分发机制(三)

在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而如果在子线程中需要去使用Handler的时候,我们就需要显式地去调用Looper的 prepare方法和loop方法,从而为子线程创建其唯一的Looper. 具体代码如下: class LooperThread extends Thread { public Handler mHandler; public void run()

Android中的Handler的机制与用法详解

概述: 很多android初学者对android 中的handler不是很明白,其实Google参考了Windows的消息处理机制, 在Android系统中实现了一套类似的消息处理机制.在下面介绍handler机制前,首先得了解以下几个概念:     1. Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程.     2. Message Queue 消息队列,用来存放通过Handler发布的消息,按照先

Android中的Handler的具体用法

Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.Android利用Handler来实现UI线程的更新的. Handler是Android中的消息发送器,其在哪个Activity中创建就属于且紧紧属于该Activity.还可以说其在哪个线程中new的,就是那个线程的Handler. Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的U

android中的Handler和Callback机制

android中的Handler和Callback机制 - - ITeye技术网站 Handler主要用来在线程之间的通信的机制.如在Activity或Service中需要接受其他线程的消息,则在需要接收消息的Activity或Service中需要实现Handler.Callback接口,实现这个接口的: Java代码 ? public?boolean?handleMessage(?Message?inMessage?)?:?? public boolean handleMessage( Mes