文档章节

运用Handler.post()方法进行数据更新跟用Message对比(18)

f
 flyqilong
发布于 2016/02/27 21:23
字数 586
阅读 53
收藏 0
点赞 1
评论 0
//运用Handler.post()
public class SecondActivity extends Activity {
	private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
	private ImageView imageview;
	private Handler handler = new Handler();// 注意:这里用handler.post()方法,所以不用实现里面的方法

	// 这种方法是不用到Message(),只是利用handler.post(Runable)方法来更新,里面其实放的是代码,注意:存放的代码它属于主线程;
	// 注意:这里用handler.post()方法,所以不用实现里面的方法

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 这个SecondActivity要用主布局记得在功能清单文件改配置
		imageview = (ImageView) this.findViewById(R.id.imageview);
		// 子线程,下载操作
		new Thread(new Runnable() {

			@Override
			public void run() {
				Log.i("MainActivity", "first"
						+ Thread.currentThread().getName());
				byte[] data = loadImage(url);
				final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
						data.length);
				handler.post(new Runnable() {
					// 注意:这里是主线程,只是一个代码,因为它没有启动所以不算线程
					@Override
					public void run() {
						Log.i("MainActivity", "second"
								+ Thread.currentThread().getName());
						imageview.setImageBitmap(bitmap);
					}
				});

			}
		}).start();
	}

	public byte[] loadImage(String url) {
		try {
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(url);
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toByteArray(response.getEntity());
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

//使用handler.sendEmptyMessage()通知更新
//这是第一种方法:利用handler.sendEmptyMessage()通知更新
//另外一种方法是不用到Message(),只是利用handler.post(Runable)方法来更新,里面其实放的是代码,注意:存放的代码它属于主线程;

public class MainActivity extends Activity {
	private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
	private ImageView imageview;
	private ProgressDialog dialog;
	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 0:
				dialog.show();
				break;

			case 1:
				imageview.setImageBitmap((Bitmap) msg.obj);
				break;
			case 2:
				dialog.dismiss();
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageview = (ImageView) this.findViewById(R.id.imageview);
		dialog = new ProgressDialog(this);
		dialog.setTitle("提示");
		dialog.setIcon(R.drawable.ic_launcher);
		dialog.setMessage("正在下载数据!!!");
		new Thread(new Runnable() {

			@Override
			public void run() {
				// 1.显示对话框
				handler.sendEmptyMessage(0);// 通知主线程显示对话框
				// 2.下载数据
				byte[] data = loadImage(url);
				Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
						data.length);
				Message message = Message.obtain();
				message.what = 1;
				message.obj = bitmap;
				handler.sendMessage(message);// 发送主线程设置图片显示
				// 3.关闭对话框
				handler.sendEmptyMessage(2);
			}

		}).start();
	}

	public byte[] loadImage(String url) {
		try {
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(url);
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toByteArray(response.getEntity());
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}


© 著作权归作者所有

共有 人打赏支持
f
粉丝 3
博文 93
码字总数 53900
作品 0
Android工程师
android 异步通信机制Handler的分析与运用

当我们应用程序启动时,Android系统就会创建一个主线程即UI线程,在这个UI线程中进行对UI控件的管理,如页面的刷新或者事件的响应等过程。同时Android规定在UI主线程不能进行耗时操作,否则会...

ostracod
06/29
0
0
Android开发——子线程操作UI的几种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制。 转载请标明出处...

SEU_Calvin
2016/08/04
0
0
详解Android中Handler的使用方法

在Android开发中,我们经常会遇到这样一种情况:在UI界面上进行某项操作后要执行一段很耗时的代码,比如我们在界面上点击了一个”下载“按钮,那么我们需要执行网络请求,这是一个耗时操作,...

我叫leo-
2016/04/27
88
0
杂文总结--2

实现线程:继承Thread类或者实现Runnable接口 由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sed...

ctozhong
2014/05/12
0
0
Handler线程间通信

异步更新之Handler.post解惑 在Android中使用Handler和Thread线程执行后台操作 对于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Messa...

wangpeiming110
2015/09/15
0
0
Android:用Handler实现异步处理功能

一.一个问题 有这样一个问题值得我们思考,若把一些类似于下载的功能(既耗时且不一定有结果)写在Activity(主线程)里,会导致Activity阻塞,长时间无响应,直至页面假死(如果5秒钟还没有完成...

z.net
2012/08/15
0
0
Android异步消息处理机制完全解析-Handler详解

参考资料 - 官方介绍文档 - Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 - Android异步消息处理机制完全解析,带你从源码的角度彻底理解 - 慕课网课程-Androi...

javen205
2017/03/25
0
0
Android网络加载时显示进度条

在联网获取数据时,用一个进度条提示用户正在加载数据,以下讲一下我是如何实现这种效果的。      由于Android的界面更新只能通过自己的UI线程进行操作,所以我们需要用到Handler在进行更...

simpower
2014/09/29
0
0
使用handler更新下载图片简单例子

跟新UI第一种方式 MainActivity类 代码 public class MainActivity extends Activity { //下载图片的地址URL private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201......

初来小修
2016/02/13
14
0
从安卓开发谈设计模式

1、单例模式 : Aplication 对象 2、Template 模式:集成Activity类后,必须重写父类的方法,并且 父类的方法调用会按一定的顺序自动被调用(onCreate onResume onStop onDestroy) 3、适配器...

在水一方发盐人
2016/11/17
8
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

tomcat 学习笔记之 Session管理

1、Catalina 通过一个 Session 管理器的组件来管理建立的Session 对象 该组件由 org.apache.catalina.Manager 接口表示 Session 管理器必须与一个 Context 关联 Session 管理器负责,创建、更...

职业搬砖20年
刚刚
0
0
jquery获取input框的几种方式

//如何用jquery获取<input id="test" name="test" type="text"/>中输入的值?$(" #test ").val()$(" input[ name='test' ] ").val()$(" input[ type='text' ] ").val()$(" input[ ......

gulf
3分钟前
0
0
gradle的环境变量的配置

gradle的环境变量的配置 1.首先下载jdk,并且配置jdk的环境变量. 2.找到自己AS安装gradle的目录 我自己的目录为:F:\Android Studio3.1.3\gradle\gradle-4.4 创建环境变量:GRADLE_PATH: F:\A...

android-key
9分钟前
0
0
saltstack配置apache

1.相关配置 #vim /etc/salt/master //打开如下内容的注释 file_roots: base: - /srv/salt #mkdir /srv/salt #vim /srv/salt/top.sls base: 'slaver.test.com': - apache 注意:若换成 '*',则......

硅谷课堂
10分钟前
0
0
Nested enum types are implicitly static

.Nested enum types are implicitly static So there's no need to declare them static explicitly....

Yixin_Nemo
10分钟前
0
0
xlsxwriter 常用excel格式

官方文档:xlsxwriter 官方文档 微博只对常用的方法做了总结和coding,详细方法请参考官方文档 常规写入数据: 写入字符串write_string() import xlsxwriterworkbook = xlsxwriter.Workb...

白木日勿
10分钟前
0
0
TeX

Ito LaTeX是一类用于编辑和排版的软件,用于生成PDF文档。 LaTeX编辑和排版的核心思想在于,通过\section和\paragraph等语句,规定了每一句话在文章中所从属的层次,从而极大方便了对各个层次...

E-C-Ares
13分钟前
0
0
nodejs调用webservice接口

刚接触花了一天时间去查找资料,网上资料也是够了,很多都试了不行,最后看了还是那么简单 主要是了node-soap node-soap-ntlm soap-ntlm-2,这几个试了都有缺陷, 1 首先安装soap npm instal...

lovelan1314
14分钟前
0
0
SUSE Linux 将被 EQT 收购

SUSE再次易主 Micro Focus 宣布将其一大部分业务出售给瑞典私人股本集团殷拓(EQT),所得的一部分收益将用来减轻债务,其余部分将返给股东。EQT 是一家专注于开发领域的投资公司,在软件行业拥...

linux-tao
22分钟前
0
0
Elastic-Job定时任务

用Elastic-Job可解决分布式重复执行问题 如果业务工程采用集群化的部署,可能会多次重复执行定时任务而导致系统的业务逻辑错误,并产生系统故障。 job.properties simple.id=recommendJobs...

lsjlgo
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部