`
ET焖猪仔
  • 浏览: 237313 次
  • 性别: Icon_minigender_1
  • 来自: 广东
社区版块
存档分类
最新评论

android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理(2)

阅读更多
用 Handler 来实现异步消息处理,以一个可以实时汇报下载进度的异步下载类为例
开发一个 Android 类库,本例中此类库名为 webabcd_util
New -> Java Project
项目上点右键 -> Build Path -> Add Libraries -> User Library -> User Libraries -> New -> 为类库起个名字 -> 选中这个类库 -> Add JARs 导入 Android 的 jar 包
项目上点右键 -> Build Path -> Add Libraries -> User Library -> 选择 Android 库

DownloadManagerAsync.java

代码
package webabcd.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.protocol.HTTP;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

// 以一个实例,即异步下载,来演示 Android 的异步消息处理(用 Handler 的方式)
public class DownloadManagerAsync {

    public DownloadManagerAsync() {

    }

    // 实例化自定义的 Handler
    EventHandler mHandler = new EventHandler(this);

    // 按指定 url 地址下载文件到指定路径
    public void download(final String url, final String savePath) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    sendMessage(FILE_DOWNLOAD_CONNECT);
                    URL sourceUrl = new URL(url);
                    URLConnection conn = sourceUrl.openConnection();
                    InputStream inputStream = conn.getInputStream();

                    int fileSize = conn.getContentLength();

                    File savefile = new File(savePath);
                    if (savefile.exists()) {
                        savefile.delete();
                    }
                    savefile.createNewFile();

                    FileOutputStream outputStream = new FileOutputStream(
                            savePath, true);

                    byte[] buffer = new byte[1024];
                    int readCount = 0;
                    int readNum = 0;
                    int prevPercent = 0;
                    while (readCount < fileSize && readNum != -1) {
                        readNum = inputStream.read(buffer);
                        if (readNum > -1) {
                            outputStream.write(buffer);
                            readCount = readCount + readNum;

                            int percent = (int) (readCount * 100 / fileSize);
                            if (percent > prevPercent) {
                                // 发送下载进度信息
                                sendMessage(FILE_DOWNLOAD_UPDATE, percent,
                                        readCount);

                                prevPercent = percent;
                            }
                        }
                    }

                    outputStream.close();
                    sendMessage(FILE_DOWNLOAD_COMPLETE, savePath);

                } catch (Exception e) {
                    sendMessage(FILE_DOWNLOAD_ERROR, e);
                    Log.e("MyError", e.toString());
                }
            }
        }).start();
    }

    // 读取指定 url 地址的响应内容
    public void download(final String url) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    sendMessage(FILE_DOWNLOAD_CONNECT);
                    URL sourceUrl = new URL(url);
                    URLConnection conn = sourceUrl.openConnection();
                    conn.setConnectTimeout(3000);
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(conn.getInputStream(),
                                    HTTP.UTF_8));

                    String line = null;
                    StringBuffer content = new StringBuffer();
                    while ((line = reader.readLine()) != null) {
                        content.append(line);
                    }

                    reader.close();

                    sendMessage(FILE_DOWNLOAD_COMPLETE, content.toString());

                } catch (Exception e) {
                    sendMessage(FILE_DOWNLOAD_ERROR, e);
                    Log.e("MyError", e.toString());
                }
            }
        }).start();
    }

    // 向 Handler 发送消息
    private void sendMessage(int what, Object obj) {
        // 构造需要向 Handler 发送的消息
        Message msg = mHandler.obtainMessage(what, obj);
        // 发送消息
        mHandler.sendMessage(msg);
    }

    private void sendMessage(int what) {
        Message msg = mHandler.obtainMessage(what);
        mHandler.sendMessage(msg);
    }

    private void sendMessage(int what, int arg1, int arg2) {
        Message msg = mHandler.obtainMessage(what, arg1, arg2);
        mHandler.sendMessage(msg);
    }

    private static final int FILE_DOWNLOAD_CONNECT = 0;
    private static final int FILE_DOWNLOAD_UPDATE = 1;
    private static final int FILE_DOWNLOAD_COMPLETE = 2;
    private static final int FILE_DOWNLOAD_ERROR = -1;

    // 自定义的 Handler
    private class EventHandler extends Handler {
        private DownloadManagerAsync mManager;

        public EventHandler(DownloadManagerAsync manager) {
            mManager = manager;
        }

        // 处理接收到的消息
        @Override
        public void handleMessage(Message msg) {

            switch (msg.what) {
            case FILE_DOWNLOAD_CONNECT:
                if (mOnDownloadConnectListener != null)
                    mOnDownloadConnectListener.onDownloadConnect(mManager);
                break;
            case FILE_DOWNLOAD_UPDATE:
                if (mOnDownloadUpdateListener != null)
                    mOnDownloadUpdateListener.onDownloadUpdate(mManager,
                            msg.arg1);
                break;
            case FILE_DOWNLOAD_COMPLETE:
                if (mOnDownloadCompleteListener != null)
                    mOnDownloadCompleteListener.onDownloadComplete(mManager,
                            msg.obj);
                break;
            case FILE_DOWNLOAD_ERROR:
                if (mOnDownloadErrorListener != null)
                    mOnDownloadErrorListener.onDownloadError(mManager,
                            (Exception) msg.obj);
                break;
            default:
                break;
            }
        }
    }

    // 定义连接事件
    private OnDownloadConnectListener mOnDownloadConnectListener;
    public interface OnDownloadConnectListener {
        void onDownloadConnect(DownloadManagerAsync manager);
    }
    public void setOnDownloadConnectListener(OnDownloadConnectListener listener) {
        mOnDownloadConnectListener = listener;
    }

    // 定义下载进度更新事件
    private OnDownloadUpdateListener mOnDownloadUpdateListener;
    public interface OnDownloadUpdateListener {
        void onDownloadUpdate(DownloadManagerAsync manager, int percent);
    }
    public void setOnDownloadUpdateListener(OnDownloadUpdateListener listener) {
        mOnDownloadUpdateListener = listener;
    }

    // 定义下载完成事件
    private OnDownloadCompleteListener mOnDownloadCompleteListener;
    public interface OnDownloadCompleteListener {
        void onDownloadComplete(DownloadManagerAsync manager, Object result);
    }
    public void setOnDownloadCompleteListener(
            OnDownloadCompleteListener listener) {
        mOnDownloadCompleteListener = listener;
    }

    // 定义下载异常事件
    private OnDownloadErrorListener mOnDownloadErrorListener;
    public interface OnDownloadErrorListener {
        void onDownloadError(DownloadManagerAsync manager, Exception e);
    }
    public void setOnDownloadErrorListener(OnDownloadErrorListener listener) {
        mOnDownloadErrorListener = listener;
    }
}


调用上面的自定义的 Android 类库

项目上点右键 -> Properties -> Java Build Path -> Projects -> Add 引用上面的类库

Main.java

代码 
package com.webabcd.handler;

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

import webabcd.util.DownloadManagerAsync;

public class Main extends Activity implements
        DownloadManagerAsync.OnDownloadCompleteListener,
        DownloadManagerAsync.OnDownloadUpdateListener,
        DownloadManagerAsync.OnDownloadErrorListener {
    
    TextView txt;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        DownloadManagerAsync manager = new DownloadManagerAsync();
        manager.setOnDownloadCompleteListener(this);
        manager.setOnDownloadUpdateListener(this);
        manager.download("http://files.cnblogs.com/webabcd/Android.rar", "/sdcard/Android.rar");
        
        txt = (TextView) this.findViewById(R.id.txt);
        txt.setText("开始下载");
    }

    public void onDownloadComplete(DownloadManagerAsync manager, Object result) {

        txt.setText("下载完成");
    }
    
    public void onDownloadUpdate(DownloadManagerAsync manager, int percent) {

        txt.setText("下载进度:" + String.valueOf(percent) + "%");
    }
    
    public void onDownloadError(DownloadManagerAsync manager, Exception e) {

        txt.setText("下载出错");
    }
}

分享到:
评论
2 楼 ponce 2013-02-26  
不错哦,正好用上
1 楼 nocb 2011-07-13  
写的非常好 ,3q  

相关推荐

    hander_sy2.rar_android

    通过"hander_sy2"的学习,初学者将能够深入理解Android中线程通信的机制,并学会在实际项目中运用Handler来解决多线程问题,提升应用性能和用户体验。实践案例是学习的最佳途径,通过动手操作,开发者能更好地理解和...

    hander_sy1.rar_android

    在Android开发领域,Handler是实现线程间通信的重要机制,特别是在UI更新和异步任务处理中扮演着核心角色。标题“hander_sy1.rar_android”表明这是一个关于Android Handler的实例教程,适合初学者进行学习。下面...

    Android应用源码之HandlerMessage1_HandlerMessage.zip

    在Android应用开发中,HandlerMessage1_HandlerMessage是一个关键的主题,涉及到Android系统中的消息处理机制,尤其是Handler、Message和Looper的使用。这些组件是Android异步编程的重要组成部分,用于解决UI线程与...

    Android Handler 图片浏览器

    在Android开发中,Handler是一种非常重要的组件,它与线程通信密切相关,特别是在更新UI和处理异步任务时。本文将深入探讨如何利用Handler构建一个图片浏览器,并结合计时器(Timer)来实现特定功能。 首先,理解...

    Hander的使用

    在Android开发中,Handler是一种非常重要的机制,它用于在主线程和子线程之间进行通信,处理异步消息。本文将深入探讨Handler的使用,并结合给出的标签"源码"和"工具"来分析其核心原理。 首先,我们了解Handler的...

    android 异步刷新demo

    在Android开发中,异步处理是一项至关重要的技术,主要用于解决主线程执行耗时操作导致的UI卡顿问题。本示例“android 异步刷新demo”着重演示了两种常见的异步处理方式:AsyncTask和Handler,帮助开发者理解它们的...

    androidHandler测试的demo

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。这个机制允许开发者在不同的线程之间传递消息,通常用于更新UI或者执行异步任务。下面我们将深入...

    Android App中实现图片异步加载的实例分享

    那么异步消息处理可以用哪呢? 1、用于UI线程当Bitmap加载完成后更新ImageView 2、在图片加载类初始化时,我们会在一个子线程中维护一个Loop实例,当然子线程中也就有了MessageQueue,Looper会一直在那loop停着等待...

    Laravel开发-lumen-api-hander

    2. **格式化错误**:根据API的需求,将异常信息转换为结构化的JSON响应,通常包含状态码、错误代码、错误消息和可能的额外信息。 3. **统一错误响应**:无论哪种类型的异常,都应返回一致的响应格式,这样客户端可以...

    Handler和TimerTask实现的简易定时器

    总结起来,通过Handler和TimerTask实现的简易定时器利用了Java的定时任务机制和Android的消息处理机制,可以在指定的间隔内周期性地执行任务。这种实现方式简单易懂,适用于许多基本的定时需求。但在复杂的应用场景...

    jax_rpc webservices hander头增加用户密码

    最后,关于提到的"压缩包子文件的文件名称列表"hander2,这可能指的是处理程序的实现或配置文件。在实际开发中,这些文件通常包含在项目的类路径或部署包中,以便服务器能够找到并使用它们。 总结起来,JAX-RPC Web...

    Android基础网络

    Handler是Android中处理异步消息的关键组件,它与Looper和Message紧密配合工作。Looper是消息循环,它持续检查Message Queue(消息队列),并将消息分发给相应的Handler进行处理。Message是实际携带数据的实体,而...

    Handler方法

    3. **消息循环**:`Looper`类负责管理消息队列,它通过一个无限循环不断地从消息队列中取出消息并交给`Handler`处理。 4. **消息处理**:`Handler`接收到消息后会调用`handleMessage`方法进行处理。在这个方法中,...

    Android Handler 机制实现原理分析

    Android Handler机制是Android异步消息处理的核心,它用于在主线程和子线程之间进行通信,确保UI更新在主线程中执行。以下是对Handler机制实现原理的详细解析: 1. **Handler**: Handler类是消息处理的中心,它有两...

    Android之Web Service实现天气预报查询

    Android之Web Service实现天气预报查询 利用Ksoap实现Web Service功能,大家自己练习的时候需要用到Ksoap2包,下载地址为 http://download.csdn.net/detail/hander_wei/5713765

    Handler使用

    `Handler`是Android消息处理机制的核心部分,它与`Looper`和`Message`共同协作,实现了线程间的消息传递。`Handler`通常在主线程(UI线程)中创建,用于接收并处理来自其他线程的消息。 ### 2. Handler工作原理 - ...

    Android的网络与通信应用程序设计PPT

    (1)理解HTTP协议、URL请示的类别 (2)理解并掌握Android的线程与Hander消息机制 (3)学会使用HttpURLConnection访问网络 (4)学会使用HttpClient访问网络

    模拟温度监控系统源码(Android+Java+SQL Server 移动终端(Android)).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用!...通过用户登录信息与数据库的ID相匹配,通过Android定时器按一定周期生产温度数据,同时通过线程来周期绘制温度趋势的UI界面(Hander处理)).zip

    Android中Handler与Message的简单实例

    Handler是Android中用于发送和处理消息的处理者,它可以在不同的线程之间传递消息。Handler可以发送消息给其他线程,也可以处理从其他线程传递来的消息。Handler的主要方法包括sendMessage()方法和handleMessage()...

Global site tag (gtag.js) - Google Analytics