第81章、Handle-Message-Looper消息机制之二(从零开始学Android)
来源:互联网 发布:淘宝登陆异常如何解除 编辑:程序博客网 时间:2024/05/01 08:24
本章着重通过一个网络通信应用再次了解一下Handle、Message、Looper实际用法。
一、设计界面
1、布局文件
打开res/layout/activity_main.xml文件。
输入以下代码:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tvmsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /></LinearLayout>
二、程序文件
打开“src/com.genwoxue.hml/MainActivity.java”文件。
然后输入以下代码:
package com.genwoxue.hml;import java.io.ByteArrayOutputStream;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.app.Activity; import android.app.ProgressDialog;import android.content.DialogInterface;import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.widget.TextView; public class MainActivity extends Activity{ private String TAG = "HandlerTest"; private ReceiveMessageThread receiveMessageThread =null; private EventHandler mHandler = null; private TextView tv = null; ProgressDialog pdialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView)super.findViewById(R.id.tvmsg); //创建对话框 pdialog = new ProgressDialog(this); //设置对话框取消按钮 pdialog.setButton("cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int i) { dialog.cancel(); } }); //对话对话框取消事件 pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { finish(); } }); //初始化对话框pdialog.setCancelable(true); pdialog.setMax(100); pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pdialog.show(); tv.setText("正在下载中……"); //启动线程receiveMessageThread = new ReceiveMessageThread(); receiveMessageThread.start(); } //消息处理 class EventHandler extends Handler{ public EventHandler(Looper looper){ super(looper); } public EventHandler(){ super(); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what){ case 1: //消息为1传递进度 int pos=Integer.valueOf((String)msg.obj); tv.setText((String)msg.obj); pdialog.setProgress(pos); break; case 2: //消息为2,显示结果 tv.setText((String)msg.obj); pdialog.dismiss(); break; default: Log.e(TAG,(String)msg.obj); break; } } } //创建子线程,下载网页文件 class ReceiveMessageThread extends Thread { @Override public void run(){ Looper.prepare(); System.out.println("thread is start!"); String result = null;try{ HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet("http://www.genwoxue.com"); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); System.out.print(length);if(is != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[128]; int ch = -1; int count = 0; int percent=0;while((ch = is.read(buf)) != -1) { baos.write(buf, 0, ch); count += ch; if(length > 0) { percent=(int) ((count / (float) length) * 100);Looper looper = Looper.getMainLooper(); mHandler = new EventHandler(looper); mHandler.removeMessages(1); Message msg =new Message(); if(percent<100){ msg.what=1; msg.obj= String.valueOf(percent); } else{ result = new String(baos.toByteArray()); msg.what=2; msg.obj= String.valueOf(result); } // 将Message对象送入到main thread的MessageQueue里面 MainActivity.this.mHandler.sendMessage(msg); } Thread.sleep(50); // 让线程休眠50ms } } } catch(Exception e) { e.printStackTrace(); } Looper.loop(); } } }
三、配置文件
打开“AndroidManifest.xml”文件。
然后输入以下代码:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.genwoxue.hml" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.genwoxue.hml.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
注意:由于要访问互联网,需要在AndroidManifest.xml文件中添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
四、运行结果
- 第81章、Handle-Message-Looper消息机制之二(从零开始学Android)
- 第80章、Handle-Message-Looper消息机制之一(从零开始学Android)
- Android Handle,Looper,Message消息机制
- 从零开始学android<Message消息机制.四十二.>
- Android Handle机制 理解Looper、Handle、Message的关系
- android的消息处理机制handle解析——Looper,Handler,Message
- Android消息机制之四---Looper,Handler,Message例子
- Android异步消息处理机制之Handler、Looper、Message
- Android 异步消息处理机制之Handler、Message、Looper
- android消息处理机制学习(二)-Handler,Message,MessageQueue,Looper图例讲解
- Android 中的消息模型(Message,MessageQueue,handle,looper)
- Android 中的消息模型(Message,MessageQueue,handle,looper,)
- Android 消息机制(Handler,Looper,MessageQueue,Message)
- Android 消息机制(Handler,Looper,MessageQueue,Message)
- Android:消息处理机制(Handler,Message,Looper)分析
- Android 消息处理机制(Looper、Handler、MessageQueue,Message)
- Android 消息处理机制(Looper、Handler、MessageQueue,Message)
- Android 消息处理机制(Looper、Handler、MessageQueue,Message)
- weka中的数据文件说明
- JSP之JDBC操作Sql Server数据库
- 数据结构(十一) --- 抽象数据类型(完)
- WINCE中dll的使用(VB.net)操作另一个窗口句柄
- 第80章、Handle-Message-Looper消息机制之一(从零开始学Android)
- 第81章、Handle-Message-Looper消息机制之二(从零开始学Android)
- 真有人做p2p,在embedded platform上?
- CMMI-软件项目功能点估算方法
- 工厂方法模式
- wireshark功能模块分析
- SQLITE 修改表结构
- DLL的线程中创建WINDOWS窗口并接收U盘移动磁盘查入消息
- mysql初始密码设置
- 软件开发流程