入门异步任务之Handler

效果图如下:

 


 1、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lesson"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="7" />
    <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=".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>

 2、activity_main.xml
 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="18dp"
        android:text="加载图片" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        
        />

</RelativeLayout>

 3、MainActivity.java

package com.lesson;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
	private Button button;
	private ProgressDialog progerssDialog;
	private ImageView imageView;//要加载的图片
	private int Thread1=1;
	private final String url="http://pic.4j4j.cn/upload/pic/20130701/d363891105.jpg";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);		
		button=(Button)findViewById(R.id.button1);
		imageView=(ImageView)findViewById(R.id.imageView1);
		
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				
				//加载图片时的进度显示对话框
				progerssDialog=new ProgressDialog(MainActivity.this);
				progerssDialog.setTitle("loading");
				progerssDialog.setMessage("正在加载中...");
				
				//设置进度条水平加载
				progerssDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
				progerssDialog.show();
				//添加子线程,用于发送消息给主线程
			
				new Thread(new MyThread(url,Thread1,new MyHandler())).start();
			}
		});
	}
	
	
	class MyHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			
			super.handleMessage(msg);
			if(msg.what==Thread1){
				imageView.setImageBitmap((Bitmap)msg.obj);
				progerssDialog.dismiss();
			}
		}
	}
	class MyThread implements Runnable{
		//声明用来标识url地址参数的变量
		private String url;
		//声明用来标识线程id的变量
		private int threadId=0;
		
		private Handler handler=null;
		
		//构造函数
		public MyThread(String url,int threadId,Handler handler){
			this.url=url;
			this.threadId=threadId;
			this.handler=handler;
		}
		@Override
		public void run() {
		
			HttpGet httpGet=new HttpGet(url);
			InputStream inputStream;
			byte[] result=null;
			byte[] data=new byte[1024];
			HttpClient client = new DefaultHttpClient();
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			try {
				HttpResponse httpResponse=client.execute(httpGet);//得到响应
				if(httpResponse.getStatusLine().getStatusCode()==200){
					
					inputStream=httpResponse.getEntity().getContent();
					//文件总长度
					int filelenth=(int) httpResponse.getEntity().getContentLength();
					int readlength=0;
					int totallenth=0;
					while((readlength=inputStream.read(data))!=-1){
						totallenth+=readlength;
						int progressValue= (int)((totallenth/(float)filelenth)*100);
						Log.i("progressValue",progressValue+"");
						
						progerssDialog.setProgress(progressValue);
						outputStream.write(data, 0, readlength);
					}
					result=outputStream.toByteArray();
					
					//向handler发送消息
					 	Message msg = new Message();  
				        msg.what = threadId;  
				        Bitmap bitmap=BitmapFactory.decodeByteArray(result, 0, result.length);
				        msg.obj=bitmap;
				        handler.sendMessage(msg);  
				}
				
			} catch (ClientProtocolException e) {
				
				e.printStackTrace();
			} catch (IOException e) {
				
				e.printStackTrace();
			}finally{
				client.getConnectionManager().shutdown();
			}
		}
		
	}
}

 注:ProgressDialog加载几种方式及注意点

// 方式一:new Dialog
		final ProgressDialog dialog = new ProgressDialog(this);
		dialog.show();

 

	// 方式二:使用静态方式创建并显示,这种进度条只能是圆形条,设置title和Message提示内容
		ProgressDialog dialog2 = ProgressDialog.show(this, "提示", "正在登陆中");

 

	// 方式三 使用静态方式创建并显示,这种进度条只能是圆形条,这里最后一个参数boolean indeterminate设置是否是不明确的状态
		ProgressDialog dialog3 = ProgressDialog
				.show(this, "提示", "正在登陆中", false);

 

	// 方式四 使用静态方式创建并显示,这种进度条只能是圆形条,这里最后一个参数boolean cancelable 设置是否进度条是可以取消的
		ProgressDialog dialog4 = ProgressDialog.show(this, "提示", "正在登陆中",
				false, true);

 

 

	// 方式五 使用静态方式创建并显示,这种进度条只能是圆形条,这里最后一个参数 DialogInterface.OnCancelListener
		// cancelListener用于监听进度条被取消
		ProgressDialog dialog5 = ProgressDialog.show(this, "提示", "正在登陆中", true,
				true, cancelListener);
Android SystemUI——自定义状态栏和导航栏(十二) 通过前面的文章内容,我们了解了Android系统原生的状态栏StatusBar和车载系统状态栏CarStatusBar的启动流程以及视图构建流程,这里我们来简单的看一下自定义状态栏和导航栏视图的实现流程。 阅读详情

相关推荐

VS Code配置MASM32汇编环境:从安装到调试的完整指南

本文提供了一份详尽的指南,教你如何在VS Code中配置MASM32汇编开发环境,实现从安装、环境变量设置到编写、编译和调试32位Windows汇编窗口程序的完整工作流。通过集成现代编辑器的便利性与经典汇编工具链,旨在降低学习门槛,提升底层开发效率。

nn3456的博客 483

《第二十五章 多线程与异步任务 - Handler 消息处理机制》

Handler 主要用于发送和处理消息,而 Looper 则用于管理消息循环。在 Android 中,每个线程都可以有自己的消息循环,但 UI 线程默认已经有一个 Looper 在运行。Handler 消息处理机制是 Android 开发中实现多线程协作和异步任务的重要工具。理解 Handler 与 Looper 的关系、消息队列的工作原理以及消息的发送方式,能够帮助我们构建出高效、稳定且线程安全的应用程序。

weixin_47266126的博客 922

MATLAB仿真耗散孤子共振与金兹堡-朗道方程解析

耗散孤子共振(DSR)是非线性光学中的特殊脉冲现象,通过平衡非线性效应、色散与能量耗散实现稳定传输。其核心数学模型金兹堡-朗道方程(GLE)描述了光脉冲在增益介质中的演化规律,采用分步傅里叶方法(SSFM)可高效求解这类非线性偏微分方程。该技术在光纤激光器设计、高速光通信系统优化等领域具有重要价值,特别是在需要高能量脉冲保持稳定传输的场景。MATLAB数值仿真为理解DSR物理机制提供了直观工具,通过参数扫描可验证脉冲能量与宽度的线性关系特征,并为实际器件设计提供预测依据。

weixin_31240035的博客 257

Android(6)——Handler,异步任务

文章目录Android1 Handler1.1 概念1.2 Handler使用1.3 Handler 存在的问题1.4 Handler实践的三种效果2 异步任务2.1 AsyncTask2.2 网络下载demo Android 安卓开发者指南:https://developer.android.google.cn/guide 1 Handler 1.1 概念 1.Handler:消息分发对象,进行发送和处理消息,并且其Runable对象和一个线程的MessageQueue关联。 2.为什么要使用Handle

weixin_45044097的博客 838

105. replace( )函数

【目录】

weixin_63986098的博客 1万+

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5中间件的完整流程,包括环境准备、依赖调整、Web.xml版本适配、部署配置优化及常见问题解决方案。特别针对信创改造需求,提供了排除Tomcat依赖、处理BES专用starter等实用技巧,帮助开发者顺利完成国产中间件迁移。

weixin_30825581的博客 1098

android的异步任务与handler分析与初步实战

android的异步任务与handler分析

ShiXinXin_Harbour的博客 860

Agile Modbus使用和学习笔记

i < len;这里仅仅需要提供获取函数即可,离散输入是只读类型i++) {return 0;只读类型寄存器i++) {return 0;i < len;

Car12 167

Android多线程及异步任务消息处理机制(一)--Handler的使用

转载请注明出处: 前言         我们知道,不管在任何的语言或操作系统平台(Android系统也不例外),多线程、多进程和异步任务的相关技术地讨论都是永恒的话题,很多的开发需求都需要使用多线程及异步任务以便实现多任务的同时执行和灵活的用户操作界面,而很多系统在使用过程中出现诸多莫名其妙的问题,都是由于开发人员使用多线程不当造成的,因此掌握在各个平台上的多线程及异步任务的原

叶功恒的博客专栏 6653

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5286

TMC2240 芯片数据手册解读|第三篇 TMC2240 芯片引脚配置与说明

本文详细解析了TMC2240芯片的两款封装(TQFN32和TSSOP38-EP)的引脚分布、电气属性及硬件设计要点。内容涵盖:1)芯片内部功能架构,包括供电、运动控制等五大链路;2)两款封装的核心规范与适用场景;3)七大引脚分类详解(电源、控制、编码器等)及接线要求;4)PCB设计避坑指南,强调电源分割、电荷泵布局等关键点。文章提供完整的原理图绘制和硬件调试指导,适合不同基础的工程师参考实践。

BackCatK Chen的博客 1092

handler与异步任务

不知道为什么,刚才写的安卓下的事件监听会待审核,好吧,只是为了记录下我的学习状态而已 接下来说说安卓下的线程安全的问题 安卓的主线程是不允许用户将耗时的事情放在主线程中进行处理的,因为这样容易造成线程的不安全 线程安全:在java中,线程的安全就是指,例如有两个线程同时在操作同一个ArrayList的时候,我们都 知道,在add方法的时候,分两步,第一步是增加数据,第二步是增加元素的个数,那

爱吃青菜的鱼 665

DeFi核心协议代码解析

本文解析了DeFi两大核心协议Uniswap V2和Compound的智能合约架构与关键代码。Uniswap V2采用恒定乘积公式(x*y=k)实现自动做市,核心合约包括Factory、Pair和Router,具备流动性铸造、代币兑换和TWAP预言机功能。Compound借贷协议通过cToken合约管理存款和借款,采用动态利率模型和抵押率机制,包含资金利用率计算、清算触发等核心算法。两协议均采用模块化设计,通过智能合约实现去中心化金融服务的核心逻辑。

闲人编程的博客 934

netty入门,入门代码执行流程,netty主要组件的理解

入门 netty底层采用多路复用技术,是异步的。底层也是采用的NIO。 入门代码 要使用netty,第一步当然是导入坐标 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.39.Final</version> </dependency> 然后创建服务器端的代码

qq_44027353的博客 897

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[转]Android异步处理系列文章索引

转载自:http://blog.youkuaiyun.com/mylzc/article/details/6777767 mark   为了给用户带来良好的交互体验,在Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果。 本系列文章由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理。   Android异步处理一:使...

suflow 225

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android异步处理系列文章索引

本博文地址:http://blog.youkuaiyun.com/mylzc/article/details/6777767 转载请注明出处。 为了给用户带来良好的交互体验,在Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果。 本系列文章由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理。 Andro

kan1kan5的专栏 535

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android 异步处理

为了给用户带来良好的交互体验,在Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果。 本系列文章由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理。 Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 (入门) 介绍如何使用Thread+Handler的方式从非UI线程发送界面更新...

weixin_34008784的博客 76

Handler 同步屏障&异步消息

简单来说,同步屏障就是一套为了让特殊消息更快执行的一个机制。这里我们假设一个场景:我们向主线程发送了一个UI绘制操作Message,而此时消息队列中的消息非常多,那么这个Message的处理可能会得到延迟,绘制不及时造成界面卡顿。同步屏障机制的作用,是让这个绘制消息得以越过其他的消息,优先被执行。MessageQueue中的Message,有一个变量,他标志了这个Message是否是异步消息;标记为true称为异步消息,标记为false称为同步消息。同时还有另一个变量target。

Pumpkin's Blog 1146

Android 异步任务的6种实现方式详解

Android 异步任务的6种实现方式详解 Android UI线程(主线程)有几个特点: 只能在 UI 线程操作 UI 视图,不能在子线程中操作。 不能在 UI 线程中进行耗时操作,否则会阻塞 UI 线程,引起 ANR、卡顿等问题。 在 Android 开发中,我们通常将一些耗时的操作使用异步任务的方式进行处理。例如这样一种这种场景,子线程在后台执行一个异步任务,任务过程中,需要 UI 进程展示进度,这时我们就需要一个工具来实现这种需求。Android 系统为开发人员提供了一个异步任务类(Async

卜大爷的博客 4万+

Android异步任务机制—Handler

介绍熟悉Windows编程的朋友知道Windows程序是消息驱动的,并且有全局的消息循环系统。Google参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。 Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环。Handler机制主要角色Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队

程序病毒小队的博客 554

Android 异步任务的三种方式:AsyncTask,Handler+Thread,RxJava

Android 耗时任务需要在子线程中进行,开启异步任务有三种方式

Alpinist Wang 2552
上一篇: 入门android异步任务之AsyncTask(以加载网络图片为例子)
下一篇: 入门android广播简单例子
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值