一、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; @Override protected 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; @Override protected 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; } /** * 在子线程工作 主要做耗时操作 */ @Override protected 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 */ @Override protected void onPostExecute(byte[] result) { // TODO Auto-generated method stub super.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 block e.printStackTrace(); } return null; } }