Android(异步任务) AsyncTask
2015-09-20 15:41
513 查看
AsyncTask知识复习
异步加载原因A、Android单线程模型
B、耗时操作阻塞UI线程
异步加载常见方式
A、多线程\线程池
B、AsyncTask
AsyncTask类解释
class A extends AsyncTask<Params, Progress, Result>
Params 任务开始输入的数据类型,一般为String(URL)地址哦。
Progress任务执行进度的类型哦,一般可以是Integer
Result任务执行后返回的数据类型,一般不知道,看自己定义的。
AsyncTask需要重写的方法
5.
package com.example.asynctask_download; import java.io.IOException; 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 org.apache.http.impl.conn.DefaultClientConnection; import android.app.Activity; 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; public class MainActivity extends Activity { private String url = "http://h.hiphotos.baidu.com/image/pic/item/2e2eb9389b504fc2022d2904e7dde71190ef6d45.jpg"; private Button bt; private ImageView iView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button) findViewById(R.id.bt); iView = (ImageView) findViewById(R.id.imageView1); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // HttpClient httpClient = (HttpClient) new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); try { httpClient.execute(httpGet); } catch (ClientProtocolException e) { // e.printStackTrace(); } catch (IOException e) { // e.printStackTrace(); } } }); } }
当我们之间记载图片是会报出这样的错误,Android3.0后不能在UI线程中执行网络操作,否则报一下错误
> 这里是带进度条的异步图片加载方法 package com.example.asynctask_download; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.http.HttpEntity; 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 org.apache.http.impl.conn.DefaultClientConnection; import org.apache.http.util.EntityUtils; import android.R.integer; import android.app.Activity; import android.app.ProgressDialog; import android.content.Entity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; 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.widget.ProgressBar; public class MainActivity extends Activity { private String url = "http://h.hiphotos.baidu.com/image/pic/item/2e2eb9389b504fc2022d2904e7dde71190ef6d45.jpg"; private Button bt; /** * 变量或对象的描述 * * @Fields iView : 相框 * @type */ private ImageView iView; /** * 变量或对象的描述 * * @Fields bitmap : 图片 * @type */ private Bitmap bitmap; /** * 变量或对象的描述 * * @Fields progressDialog : 进度条 * @type */ private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button) findViewById(R.id.bt); iView = (ImageView) findViewById(R.id.imageView1); progressDialog = new ProgressDialog(this); progressDialog.setTitle("提示信息"); progressDialog.setMessage("正在执行,请稍等"); progressDialog.setProgressStyle(progressDialog.STYLE_HORIZONTAL); progressDialog.setCancelable(false); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 执行异步任务的操作 new MyAsyncTask().execute(url); } }); } class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> { /** * @Title:【重写】 doInBackground * @Description:耗时操作执行类 * @param params * @return */ @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; ByteArrayOutputStream outputStream = new ByteArrayOutputStream();// 创建一个输出流 InputStream inputStream_nadao = null;// 创建一个输入流用于拿到数据 // 使用网络链接类HttpClient类完成对网络数据的提取 HttpClient httpClient = (HttpClient) new DefaultHttpClient(); // 获取链接方式 HttpGet httpGet = new HttpGet(params[0]); try { HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { inputStream_nadao = httpResponse.getEntity().getContent(); // 获取文件的一个总长度 long file_length = httpResponse.getEntity() .getContentLength(); // 起始长度 int len = 0; byte[] data = new byte[1024]; // 总长度 int total_length = 0; while ((len = inputStream_nadao.read(data)) != -1) { total_length += len; int values = (int) (((total_length / (float) len) * 100)); publishProgress(values); // 将图片放到outputStream中,他可以转换成字节数组 outputStream.write(data, 0, len); } // 创建一个字节数组 byte[] result = outputStream.toByteArray(); bitmap = BitmapFactory.decodeByteArray(result, 0, result.length); } } catch (ClientProtocolException e) { // e.printStackTrace(); } catch (IOException e) { // e.printStackTrace(); } finally { if (inputStream_nadao != null) { try { inputStream_nadao.close(); } catch (IOException e) { // e.printStackTrace(); } } } return bitmap; } /** * @Title:【重写】 onPreExecute * @Description: 表示任务执行前的操作 */ @Override protected void onPreExecute() { // super.onPreExecute(); progressDialog.show(); } /** * @Title:【重写】 onProgressUpdate * @Description:这里是执行进度的方法 * @param values */ @Override protected void onProgressUpdate(Integer... values) { // super.onProgressUpdate(values); progressDialog.setProgress(values[0]); } /** * @Title:【重写】 onPostExecute * @Description:负责更新UI * @param result */ @Override protected void onPostExecute(Bitmap result) { // super.onPostExecute(result); iView.setImageBitmap(result); progressDialog.dismiss(); } } }
相关文章推荐
- Android View生命周期
- 控制台出现abd端口被占用,导致android项目不能正常运行
- Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
- Android开发者网址导航
- android handler机制和Timer采用
- Android事件分发完全解析(自己)
- Android内存管理机制详解
- Android开源控件----Android显示GIF图像控件------android-gif-drawable
- Android Api Demos登顶之路(七十六)Graphics-->ShapeDrawable
- Android AIDL技术详解
- Handler的绑定过程
- Android开源框架Volley
- Android 开源框架xUtil
- 安装Android Studio遇到的问题及解决方案
- 《第一行代码Android》笔记
- Android三种播放视频的方式
- Android权限判断checkPermission
- Android动画Animation
- Android防止按钮连续点击
- Android中的Environment.getExternalStorageState使用