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
原创粉丝点击