AsyncTask的简单用法和实例
2016-01-26 21:27
387 查看
[code]实例:从网络上下载一个图片,然后放到ImageView中,是用AsyncTask来实现的,本身逻辑也很简单,仅是在doInBackground中用HTTP请求把图片的输入流取出,然后用BitmapFactory去解析,然后再把得到的Bitmap放到ImageView中。 需要深入了解的可以参考:http://blog.csdn.net/hitlion2008/article/details/7983449 特别注意增加增加网络权限。。。。
MainActivity.java
[code]package com.example.day07_homework_asynctask; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /** * 异步任务显示图片 * 特别注意:从网络下载图片需要开启网络权限 */ public class MainActivity extends Activity implements OnClickListener{ private Button button; private ImageView imageView; String path="https://www.baidu.com/img/bd_logo1.png";//网络上的图片资源 ProgressDialog progressDialog;//声明进度条组件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化组件 initView(); } private void initView() { button =(Button) findViewById(R.id.button); imageView=(ImageView) findViewById(R.id.imageView); //给button设置监听 button.setOnClickListener(this); //创建进度条组件 progressDialog=new ProgressDialog(this); progressDialog.setTitle("正在加载"); //设置进度条标题图片 progressDialog.setIcon(R.drawable.ic_launcher); //设置进度条显示内容 progressDialog.setMessage("玩命加载中..."); //设置进度条样式(环形或条形),本例为了显示百分比,使用进度条(环形没有百分比之说) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); } /** * 主线程不能直接连接网路,需要子线程从网络获取数据,然后以io形式穿给主线程 * @author Administrator *注意三个参数 * class MyTask extends AsyncTask<Params, Progress, Result> * “启动任务执行的输入参数” * “后台任务执行的进度”--》一般使用Integer * “后台计算结果的类型” * 从网路下载图片,使用byte[]数组 */ class MyTask extends AsyncTask<String, Integer, byte[]>{ /** * 显示进度条(环) */ @Override protected void onPreExecute() { super.onPreExecute(); progressDialog.show(); } //注意doInBackground返回的值传给了onPostExecute去更新ui @Override protected byte[] doInBackground(String... params) { //可变长参数,传来的是path网址 String iamge_path =params[0]; URL url =null; InputStream inputStream = null; Byte[]result =null; try { url =new URL(iamge_path); HttpURLConnection conn=(HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); if(conn.getResponseCode()==200){ int len =0; inputStream =conn.getInputStream(); ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream(); int length =0; //获取文件的总长度,为显示进度条做准备,注意只有进度条才可以显示百分比,环形不可以 int filelength=conn.getContentLength(); byte [] buffer =new byte[1024]; //循环读入网络传下来的数据 while((len=inputStream.read(buffer))!=-1){ //获取读取了的文件长度,为进度条更新时使用 length+=len; int progess =(int) ((length/(float)filelength)*100); publishProgress(progess); //将buffer中的数据读入byteArrayOutputStream byteArrayOutputStream.write(buffer,0,len); //防止速度过快,为了看清进度条,加延时 Thread.sleep(1000); } //返回值byte数组,给onPostExcute更新ui return byteArrayOutputStream.toByteArray(); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return null; } //更新进度条(环) //在重写方法时,注意一定将类的参数填好之后再重写,避免出错 @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); //可变长参数,注意 int progress_values=values[0]; //更新进度条(环) progressDialog.setProgress(progress_values); } // 数据上穿后,更新ui界面 @Override protected void onPostExecute(byte[] result) { super.onPostExecute(result); //数据上穿完成后,进度条(环)销毁 progressDialog.dismiss(); //bitmap的使用,将字节数组 Bitmap bm=BitmapFactory.decodeByteArray(result,0,result.length); imageView.setImageBitmap(bm); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: //异步任务启动 new MyTask().execute(path); break; default: break; } } }
布局文件:
[code]<LinearLayout 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" android:orientation="vertical" android:layout_gravity="center_vertical"> <Button android:layout_gravity="center" android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="异步任务下载图片" /> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
相关文章推荐
- win8.1安装vs2015专业版 KB2919335
- ios8第1天答案2
- Trapping Rain Water
- 跨浏览器解决事件处理程序兼容问题
- muShtaP.112
- 关于Java泛型的小知识点
- IE和W3c盒模型
- win7安装 “安装程序无法创建新的系统分区”问题
- form表单重复提交
- js下拉菜单(鼠标+键盘双操作)
- Broadleaf电商系统开发(二) - 启动项目
- Js-Html 前端系列--点击非Div区域隐藏Div
- django pk和id
- cocos2dx3.2升级Android5的坑
- iOS APP启动过程
- sqlite数据库的安装与使用
- js前台加密,java后端解密
- BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )
- redhat安装wine
- shell编程学习1