ProgressDialog和异步任务
来源:互联网 发布:java设计模式使用场景 编辑:程序博客网 时间:2024/06/05 20:44
一、ProgressDialog
//使用对象 设置标题progressDialog.setTitle("标题");
//设置图标
progressDialog.setIcon(R.drawable.ic_launcher);
//设置展示的内容
progressDialog.setMessage("正在下载请稍等....");
//设置样式
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//展示
progressDialog.show();
二、UI线程和工作线程
Ui线程也是Main线程 负责会在UI界面和事件分发
俩个主要要素:
1.在Ui线程不能做阻塞操作 (在主线程阻塞超过5s程序出错 "程序无反应")2.在主线程以外的线程(子线程)不能更新UI
三、 什么是异步任务
在子线程做耗时操作 将结果回调到主线程
四、 为什么要使用异步任务
在Ui线程不能做阻塞操作 (在主线程阻塞超过5s程序出错 "程序无反应") 4.0以后 不允许在主线程下载
在主线程以外的线程(子线程)不能更新UI
1,创建一个类 继承AsyncTask,同时声明三个参数
Params:子线程执行方法里参数类型
Progress;子线程执行任务的进度类型 如果不想展示进度 Void
Result:子线程执行任务的结果类型
2,实现核心方法
doInBackground(String... params){}
onPostExecute(byte[] result)
3,在主线程中执行异步请求
完整的AsyncTask
public class MyAsyncTask extends AsyncTask<String, Integer, List<String>>{
/**
* 在首次执行异步任务时 调用此方法 做初始化操作
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
/**
* 在子线程中执行 做耗时操作
*/
@Override
protected List<String> doInBackground(String... params) {
// TODO Auto-generated method stub
//publishProgress(values)
return null;
}
/**
* 更新进度的方法 在doInBackground中 执行publishProgress(values) 将进度值发送给onProgressUpdate
*/
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
/**
* 在主线程中更新UI 在执行完doInBackground之后执行 onPostExecute
*/
@Override
protected void onPostExecute(List<String> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
//点击其他按钮 取消AsyncTask时 执行此方法
@Override
protected void onCancelled(List<String> result) {
// TODO Auto-generated method stub
super.onCancelled(result);
}}
五、设置View的显示与隐藏
1.在XML中的使用
visibility=""gone: 隐藏 不占空间
visible 显示
invisible 隐藏 占空间
2.在逻辑代码中的使用
setVisibility(...)View.GONE 隐藏 不占空间
View.VISIBLE 显示
View.INVISIBLE 隐藏 占空间
六、 AsyncTask注意事项:
1,AsyncTask实例只能调用一次
2,必须在Ui线程得到AsyncTask对象
3,AsyncTask方法 系统自动调用
4,数据进行交互(子线程和主线程交互)AsyncTask,否则开启一个线程就行
5,异步任务必须在UI线程启动
七、源码
1.ProgressDialog的使用
public class MainActivity extends Activity {private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void MyClick(View v){switch (v.getId()) {case R.id.btn01://获取对象progressDialog = new ProgressDialog(MainActivity.this );//使用对象 设置标题progressDialog.setTitle("标题");//设置图标progressDialog.setIcon(R.drawable.ic_launcher);//设置提示信息progressDialog.setMessage("正在下载请稍等.......");//设置样式progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//展示progressDialog.show();break;case R.id.btn02://获取对象progressDialog = new ProgressDialog(MainActivity.this );//使用对象 设置标题progressDialog.setTitle("标题");//设置图标progressDialog.setIcon(R.drawable.ic_launcher);//设置展示的内容progressDialog.setMessage("正在下载请稍等.......");//设置样式progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//展示progressDialog.show();break;case R.id.btn03://设置取消对话框progressDialog.dismiss();break;default:break;}}
2.AsyncTask的使用MainActivity:
package com.example.day7_asynctask_demo01;import com.example.day7_asynctask_demo01.asynctask.MyAsyncTask;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView ivShow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ivShow = (ImageView) findViewById(R.id.iv_show);}//点击按钮进行下载public void MyClick(View v){//获取异步任务对象MyAsyncTask myAsyncTask = new MyAsyncTask(ivShow);//执行异步任务 参数是获取图片的路径myAsyncTask.execute("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png");}}MyAayncTask:
package com.example.day7_asynctask_demo01.asynctask;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.util.Log;import android.widget.ImageView;import com.example.day7_asynctask_demo01.util.HttpUtils;/** * 使用异步任务下载图片 * * 1.创建一个类 继承AsyncTask,同时声明三个参数 * Params :子线程执行方法里的参数类型(一般是请求的类型) * Progress : 子线程执行任务的进度类型 如果不想展示进度 Viod * Result :子线程执行任务的结果类型 * 2.实现核心方法 * doInBackground(String... params) * onPostExecute(byte[] result) * * 3.在主线程中执行异步请求 */public class MyAsyncTask extends AsyncTask<String, Void, byte[]>{private ImageView ivShow;public MyAsyncTask(ImageView ivShow){this.ivShow = ivShow;}/** * 在子线程工作 主要做耗时操作 */@Overrideprotected byte[] doInBackground(String... params) { Log.e("AAAA", "===doInBackground==="+Thread.currentThread().getName() +"===id==="+Thread.currentThread().getId());//下载图片 获取图片地址 String imgPath = params[0]; HttpUtils httpUtils = new HttpUtils(); return httpUtils.getData(imgPath);}/** * 在主线程 工作 更新Ui */@Overrideprotected void onPostExecute(byte[] result) {// TODO Auto-generated method stubsuper.onPostExecute(result);Log.e("AAAA", "===onPostExecute==="+Thread.currentThread().getName() +"===id==="+Thread.currentThread().getId());if(result!=null&&result.length>0){//通过图片工厂 获取图片Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);//将图片展示到控件上ivShow.setImageBitmap(bitmap);}}}
HttpUtils:package com.example.day7_asynctask_demo01.util;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 org.apache.http.util.EntityUtils;public class HttpUtils {public byte[] getData(String imgPath){//创建网络请求客户端 HttpClient httpClient = new DefaultHttpClient();//网络请求方式 HttpGet httpGet = new HttpGet(imgPath); try { HttpResponse response = httpClient.execute(httpGet); //下载成功 if(response.getStatusLine().getStatusCode()==200){ return EntityUtils.toByteArray(response.getEntity()); } } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}
0 0
- ProgressDialog和异步任务
- 07 总结ProgressDialog 异步任务
- AsyncTask 异步任务 + ProgressDialog 进度条对话框
- spring执行同步任务和异步任务
- swoole和redis异步任务
- 使用GCD异步和同步执行任务
- 同步、异步转化和任务执行
- UI线程和异步任务AsyncTask
- Swift中多线程和异步任务
- ListView之BaseAdapter和AsyncTask异步任务
- 13.1 任务调度和异步执行器
- 【java学习】线程和异步任务机制
- 13.2 任务调度和异步执行器
- 异步任务和多线程的区别
- 同步、异步转化和任务执行
- @EnableAsync和@Async开始异步任务支持
- AsyncTask异步任务(并行和串行)
- 任务调度器和异步执行器
- ubuntu14.04下安装MATLAB 2015a和2014b
- MySQL Innodb 引擎
- C语言存储类型总结
- 使用数据泵导入导出数据库
- 用wamp打开进入localhost,但是无法打开localhost中的文件夹
- ProgressDialog和异步任务
- 最新版IDE工具携手云计算,助力JAVA开发快速发展
- SVM学习笔记
- 循环遍历生成button
- pdf转换成jpg格式的两种方法
- 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)
- resultMap使用不当导致出现There is no WRITEABLE property named 'student_id' in class 'com
- 使用soap调用wsdl的接口实战
- Hibernate之Criteria查询