- 浏览: 237323 次
- 性别:
- 来自: 广东
文章分类
最新评论
-
ryutaku:
楼主,我专门找回原业的用户名和密码来回复你的。view.get ...
Android中ListView.getCount()与ListView.getChildCount()区别和OnScrollListener()各个参数的区别 -
ponce:
不错哦,正好用上
android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理(2) -
sunny78117:
gundumw100 写道能不能在Xml配置中设置啊,这样硬编 ...
阻止EditText弹出输入法 -
sulanyan29:
老大,求一份原码。谢谢了: dk_application@16 ...
Android防火墙+流量统计代码 -
seventhfox:
很好的办法 谢谢分享...
阻止EditText弹出输入法
用 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
代码
开发一个 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("下载出错"); } }
发表评论
-
Fragments (Android官方文档中文版)
2011-09-14 16:32 2863概述 Fragment ... -
MediaScanner 研究
2011-05-03 19:41 1746转载http://www.iteye.com/topic/69 ... -
【Android】Uri、UriMatcher、ContentUris详解
2011-04-29 15:14 35271.Uri 通用资源标志符(Universal Resour ... -
Android事件处理
2011-01-04 11:07 2413转载:http://blog.csdn.net/G_rrrr/ ... -
Paint类常用方法
2010-11-20 15:04 1471Paint类常用方法: void setARGB(int ... -
自定义View 常用方法
2010-11-20 15:03 3891自定义View的常用方法: ... -
Android onSaveInstanceState和onRestoreInstanceState触发的时机
2010-11-16 21:46 4891先看Application Fundamentals上的一段 ... -
Activity有四种状态
2010-11-02 22:28 1767Activity有四种状态: 处于屏幕最前端的Activ ... -
介绍Android中与JSON相关的应用
2010-10-23 12:57 1921转载:http://www.j2bb.com/tr ... -
Android TextView(EditView)文字底部或者中间 加横线
2010-10-14 20:16 5204promotionLinkText = (TextView) ... -
转载:Handler方法小结(在线程中更新UI和了解HandlerThread类的用法)
2010-09-11 09:45 2777小结: * 1、向哪个Handler 发送消息,就必 ... -
卸载程序和监听卸载事件
2010-09-07 08:28 2470package com.TestUI; import j ... -
shape的使用
2010-08-20 17:47 2666<!—显示一条虚线 --> &l ... -
Android中ListView.getCount()与ListView.getChildCount()区别和OnScrollListener()各个参数的区别
2010-08-15 14:51 14555ListView.getCount()(实际上是 Adapte ... -
Android中Bitmap, Drawable, Byte之间的转化
2010-08-15 14:47 28601. Bitmap 转化为 byte ByteArrayO ... -
Uri常用方法
2010-07-29 15:47 11743Uri uri = Uri.parse("conte ... -
调用系统内部 searchUI的基本用法
2010-07-19 22:36 3020/* 按下键盘即调用搜索框 */ setDef ... -
Android改变窗口标题栏的布局
2010-07-15 14:35 2349一般应用的Title都是建立应用时在AndroidManife ... -
Activity之间实现动画的切换
2010-07-14 11:02 2292在startActivity 后调用 overridePend ... -
向Web站点发送GET请求、POST请求
2010-06-09 22:04 2796public class TestGetPost { /* ...
相关推荐
通过"hander_sy2"的学习,初学者将能够深入理解Android中线程通信的机制,并学会在实际项目中运用Handler来解决多线程问题,提升应用性能和用户体验。实践案例是学习的最佳途径,通过动手操作,开发者能更好地理解和...
在Android开发领域,Handler是实现线程间通信的重要机制,特别是在UI更新和异步任务处理中扮演着核心角色。标题“hander_sy1.rar_android”表明这是一个关于Android Handler的实例教程,适合初学者进行学习。下面...
在Android应用开发中,HandlerMessage1_HandlerMessage是一个关键的主题,涉及到Android系统中的消息处理机制,尤其是Handler、Message和Looper的使用。这些组件是Android异步编程的重要组成部分,用于解决UI线程与...
在Android开发中,Handler是一种非常重要的组件,它与线程通信密切相关,特别是在更新UI和处理异步任务时。本文将深入探讨如何利用Handler构建一个图片浏览器,并结合计时器(Timer)来实现特定功能。 首先,理解...
在Android开发中,Handler是一种非常重要的机制,它用于在主线程和子线程之间进行通信,处理异步消息。本文将深入探讨Handler的使用,并结合给出的标签"源码"和"工具"来分析其核心原理。 首先,我们了解Handler的...
在Android开发中,异步处理是一项至关重要的技术,主要用于解决主线程执行耗时操作导致的UI卡顿问题。本示例“android 异步刷新demo”着重演示了两种常见的异步处理方式:AsyncTask和Handler,帮助开发者理解它们的...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。这个机制允许开发者在不同的线程之间传递消息,通常用于更新UI或者执行异步任务。下面我们将深入...
那么异步消息处理可以用哪呢? 1、用于UI线程当Bitmap加载完成后更新ImageView 2、在图片加载类初始化时,我们会在一个子线程中维护一个Loop实例,当然子线程中也就有了MessageQueue,Looper会一直在那loop停着等待...
2. **格式化错误**:根据API的需求,将异常信息转换为结构化的JSON响应,通常包含状态码、错误代码、错误消息和可能的额外信息。 3. **统一错误响应**:无论哪种类型的异常,都应返回一致的响应格式,这样客户端可以...
总结起来,通过Handler和TimerTask实现的简易定时器利用了Java的定时任务机制和Android的消息处理机制,可以在指定的间隔内周期性地执行任务。这种实现方式简单易懂,适用于许多基本的定时需求。但在复杂的应用场景...
最后,关于提到的"压缩包子文件的文件名称列表"hander2,这可能指的是处理程序的实现或配置文件。在实际开发中,这些文件通常包含在项目的类路径或部署包中,以便服务器能够找到并使用它们。 总结起来,JAX-RPC Web...
Handler是Android中处理异步消息的关键组件,它与Looper和Message紧密配合工作。Looper是消息循环,它持续检查Message Queue(消息队列),并将消息分发给相应的Handler进行处理。Message是实际携带数据的实体,而...
3. **消息循环**:`Looper`类负责管理消息队列,它通过一个无限循环不断地从消息队列中取出消息并交给`Handler`处理。 4. **消息处理**:`Handler`接收到消息后会调用`handleMessage`方法进行处理。在这个方法中,...
Android Handler机制是Android异步消息处理的核心,它用于在主线程和子线程之间进行通信,确保UI更新在主线程中执行。以下是对Handler机制实现原理的详细解析: 1. **Handler**: Handler类是消息处理的中心,它有两...
Android之Web Service实现天气预报查询 利用Ksoap实现Web Service功能,大家自己练习的时候需要用到Ksoap2包,下载地址为 http://download.csdn.net/detail/hander_wei/5713765
`Handler`是Android消息处理机制的核心部分,它与`Looper`和`Message`共同协作,实现了线程间的消息传递。`Handler`通常在主线程(UI线程)中创建,用于接收并处理来自其他线程的消息。 ### 2. Handler工作原理 - ...
(1)理解HTTP协议、URL请示的类别 (2)理解并掌握Android的线程与Hander消息机制 (3)学会使用HttpURLConnection访问网络 (4)学会使用HttpClient访问网络
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用!...通过用户登录信息与数据库的ID相匹配,通过Android定时器按一定周期生产温度数据,同时通过线程来周期绘制温度趋势的UI界面(Hander处理)).zip
Handler是Android中用于发送和处理消息的处理者,它可以在不同的线程之间传递消息。Handler可以发送消息给其他线程,也可以处理从其他线程传递来的消息。Handler的主要方法包括sendMessage()方法和handleMessage()...