Android 多线程:使用Thread和Handler
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
比如说从网上获取一个图片,在一个ImageView中将其显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得图片后,是不能直接在网络操作线程中调用ImageView的相关方法的,因为其他线程中是不能直接访问主UI线程成员 。
完整代码:
注意的是:Manifest.xml文件中,要声明网络权限。
package com.xsjayz.thread; 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.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; /**
* 使用Thread+Handler的方式实现在非UI线程发送消息通知UI线程更新界面
*
* <a href="http://my.oschina.net/arthor" class="referer" target="_blank">@author</a> XuShaoJie
* @version 2012-08-31
*/
public class ThreadHandlerActivity extends Activity { private static final int MSG_SUCCESS = 0;// 获取图片成功的标识
private static final int MSG_FAILURE = 1;// 获取图片失败的标识 private ImageView mImageView;
private Button mButton;
private Thread mThread; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); mImageView = (ImageView) findViewById(R.id.imageView);
mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 如果线程还没启动,则启动新的线程
if (mThread == null) {
mThread = new Thread(runnable);
mThread.start(); // 否则提示:"线程已经启动"
} else {
Toast.makeText(
getApplication(),
getApplication().getString(R.string.thread_started),
Toast.LENGTH_LONG).show();
}
}
});
} private Handler mHandler = new Handler() {
// 重写handleMessage()方法,此方法在UI线程运行
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// 如果成功,则显示从网络获取到的图片
case MSG_SUCCESS:
mImageView.setImageBitmap((Bitmap) msg.obj);
Toast.makeText(getApplication(),
getApplication().getString(R.string.get_pic_success),
Toast.LENGTH_LONG).show();
break;
// 否则提示失败
case MSG_FAILURE:
Toast.makeText(getApplication(),
getApplication().getString(R.string.get_pic_failure),
Toast.LENGTH_LONG).show();
break;
}
}
}; Runnable runnable = new Runnable() {
// 重写run()方法,此方法在新的线程中运行
@Override
public void run() {
HttpClient httpClient = new DefaultHttpClient();
// 从网络上获取图片
HttpGet httpGet = new HttpGet(
"http://www.oschina.net/img/logo.gif");
final Bitmap bitmap;
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
// 解析为图片
bitmap = BitmapFactory.decodeStream(httpResponse.getEntity()
.getContent());
} catch (Exception e) {
mHandler.obtainMessage(MSG_FAILURE).sendToTarget();// 获取图片失败
return;
} // 获取图片成功,向UI线程发送MSG_SUCCESS标识和bitmap对象
mHandler.obtainMessage(MSG_SUCCESS, bitmap).sendToTarget();
}
}; }
Android 多线程:使用Thread和Handler的更多相关文章
- Android多线程分析之三:Handler,Looper的实现
Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多 ...
- 【Android多线程】Thread和线程池
https://www.bilibili.com/video/av65170691?p=3 (本文为此视频听课笔记) 一.为什么要使用多线程 二.Thread 2.1 通过继承Thread类 2.2 ...
- Android多线程分析之四:MessageQueue的实现
Android多线程分析之四:MessageQueue的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前面两篇文章<Androi ...
- android 多线程Thread,Runnable,Handler,AsyncTask
先看两个链接: 1.http://www.2cto.com/kf/201404/290494.html 2. 链接1: android 的多线程实际上就是java的多线程.android的UI线程又称 ...
- Android多线程分析之一:使用Thread异步下载图像
Android多线程分析之一:使用Thread异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 打算整理一下对 Android F ...
- Android多线程----异步消息处理机制之Handler详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android多线程分析之中的一个:使用Thread异步下载图像
Android多线程分析之中的一个:使用Thread异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可.转载请注明出处 打算整理一下对 Android Fr ...
- Android多线程源码学习笔记一:handler、looper、message、messageQueue
最近在学习Android多线程相关知识的源码,现在把自己的笔记整理一下,写出来加深印象. Android多线程通讯的核心是handler.looper.message.messageQueue,这篇文 ...
- Android多线程:深入分析 Handler机制源码(二)
前言 在Android开发的多线程应用场景中,Handler机制十分常用 接下来,深入分析 Handler机制的源码,希望加深理解 目录 1. Handler 机制简介 定义一套 Android 消息 ...
- Android多线程分析之二:Thread的实现
Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多线程分析之一 ...
随机推荐
- 【转】Android低功耗蓝牙应用开发获取的服务UUID
原文网址:http://blog.csdn.net/zhangjs0322/article/details/39048939 Android低功耗蓝牙应用程序开始时获取到的蓝牙血压计所有服务的UUID ...
- SQLCMD的用法,使用CMD 执行sql语句
SQLCMD的用法,使用CMD 执行sql语句 SQLCMD 允许在Windows命令窗中通过命令行提示符运行脚本. 语法如下: sqlcmd [ { { -U <login id> ...
- 金牌分析师助力 鲁泰A图谋再造一个“鲁泰”?_财经_中国网
金牌分析师助力 鲁泰A图谋再造一个"鲁泰"?_财经_中国网 金牌分析师助力 鲁泰A图谋再造一个"鲁泰"?
- ZOJ3329之经典概率DP
One Person Game Time Limit: 1 Second Memory Limit: 32768 KB Special Judge There is a very ...
- Android FastJson解析
1.导包 compile 'com.alibaba:fastjson:1.2.21' public static final Object parse(String text); // 把JSON文本 ...
- 数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)
堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排 ...
- 基于MyBatis的数据库切分框架,可实现数据的水平切分和垂直切分。 http://www.makersoft.org
https://github.com/makersoft/mybatis-shards MyBatis-Shards 专业的MyBatis数据库切分框架 MyBatis Shards简介 MyBati ...
- [Flexbox] Using order to rearrange flexbox children
Using the order property we alter the order in which flexbox children appear on the page, without ma ...
- Linux 下实现控制屏幕显示信息和光标的状态
//display.h /************************************************************* FileName : display.h File ...
- ios创建的sqlite数据库文件如何从ios模拟器中导出
为了验证数据库的结构,有的时候需要使用一些管理工具来直接查看sqlite数据库的内容,在windows下有sqlite3的专用工具下载,而在ios下也可以使用火狐浏览器的插件sqlitemanager ...