ProgressDialog和异步任务

一、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>{

/**
* 在首次执行异步任务时  调用此方法   做初始化操作
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}

/**
* 在子线程中执行   做耗时操作
*/
@Override
protected List 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 result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}


//点击其他按钮  取消AsyncTask时  执行此方法
@Override
protected void onCancelled(List 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{

	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;
	}

	
	
}





你可能感兴趣的:(Android)