一周没学习,累觉不爱,周一新刀到手,结果就把手指给切了5MM深1cm宽,直接缝了四针,真是痛苦到极点了!隔一天还得换次药,现在总算不是太影响敲代码了,感觉有点为自己开脱的感觉。花了300多,一周时间,真的很不划算,开始敲代码吧。。
AsyncTask的学习
AsyncTask就是对Handler和Thread的封装,简化了一些操作
常见的方法有四个:
onPreExecute(); 执行在主线程中,异步任务前开始前调用.
doInBackground();执行在子线程中,异步任务的过程中调用.
onPostExecute();执行在主线程中,任务完成后调用.
onProgressUpdate();执行在主线程中,在执行过程中操作进度的改变.
/**
* 异步下载demo
* 1:准备权限相关: 网络权限 读写存储设备权限
* 2: 界面 Layoout
* 3:下载前要做的事情
* 4:下载中要做的事情
* 5:下载完成后要做的事情
*/
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int INIT_PROGRESS = 0;
private static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
private static final String APK_NAME = "aaaa.apk";
private ProgressBar mProgressBar;
private Button mButton;
private TextView mDwonLoadText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initListener();
}
private void initView() {
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mButton = (Button)findViewById(R.id.button);
mDwonLoadText = (TextView)findViewById(R.id.tv_download);
}
private void initData() {
mProgressBar.setProgress(INIT_PROGRESS);//设置进度
mButton.setText(R.string.click_dwonload);
mDwonLoadText.setText(R.string.click_dwonload);
}
private void initListener() {
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击开始下载....执行耗时操作
DwonloadAsyncTask dwonloadAsyncTask = new DwonloadAsyncTask();
//传入的参数。。 可以是任何参数 这里一般传入url地址
dwonloadAsyncTask.execute(APK_URL);
}
});
}
/**
* String 参入的参数
* Integer 进度条的进度
* Boolean 返回值
*/
class DwonloadAsyncTask extends AsyncTask{
//获取文件存储的路径
String apkPash = Environment.getExternalStorageDirectory()+File.separator+ APK_NAME +File.separator;
/**
* 此方法执行在子线程中,是AsnycTask执行的开始方法,在异步任务之前执行
* 一般用来操作ui
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* 此方法执行在子线程中,是AsnycTask的执行过程中的方法
* @param params 入参
* @return 出参
*/
@Override
protected Boolean doInBackground(String... params) {
if (params!=null && params.length>0){
//接受params传入进来的参数
String apkUrl = params[0];
try {
//创建URL
URL url = new URL(apkUrl);
//创建连接 并打开
URLConnection conn = url.openConnection();
//获取url的一些参数
//连接文件的总大小
int contentLength = conn.getContentLength();
//获取文件的输入流
InputStream is = conn.getInputStream();
//获取文件存储的路径
String apkPash = Environment.getExternalStorageDirectory()+File.separator+ APK_NAME +File.separator;
File file = new File(apkPash);
//对文件路径做下处理
if(file.exists()){
//如果不为空删除文件
file.delete();
}
//记录已经下载的大小
int downLoadSize =0;
//记录每次下载大小
int len = 0;
//每次下载多少字节
byte[] bytes = new byte[1024];
//创建文件输出流管道
OutputStream os = new FileOutputStream(apkPash);
//开始下载文件
while ((len = is.read(bytes)) != -1){
//记录每次下载的进度
downLoadSize += len;
os.write(bytes,0,len);
//处理进度条 抛出进度
publishProgress(downLoadSize*100 /contentLength);
}
os.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}else{
return false;
}
}
/**
* 此方法执行在主线程中,在异步任务执行完后
* 一般用来操作结果
* @param b
*/
@Override
protected void onPostExecute(Boolean b) {
//更新UI
mButton.setText(b?"下载完成":"下载失败");
mDwonLoadText.setText(b?"下载完成"+apkPash:"下载失败");
}
/**
* 在执行过程中操作进度的改变
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
if(values !=null && values.length>0){
//接受进度
Integer value = values[0];
//更新进度条
mProgressBar.setProgress(value);
}
}
}
}
简单封装下步骤
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int INIT_PROGRESS = 0;
private static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
private static final String APK_NAME = "aaaa.apk";
private ProgressBar mProgressBar;
private Button mButton;
private TextView mDwonLoadText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initListener();
}
private void initView() {
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mButton = (Button)findViewById(R.id.button);
mDwonLoadText = (TextView)findViewById(R.id.tv_download);
}
private void initData() {
mProgressBar.setProgress(INIT_PROGRESS);//设置进度
mButton.setText(R.string.click_dwonload);
mDwonLoadText.setText(R.string.click_dwonload);
}
private void initListener() {
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取文件存储的路径
final String apkPath = Environment.getExternalStorageDirectory()+File.separator+ APK_NAME +File.separator;
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DwonLoadHelper.dwonLoad(APK_URL, apkPath, new DwonLoadHelper.OnDownLoadListener() {
@Override
public void onStart() {
mButton.setText("正在下载");
mDwonLoadText.setText("正在下载");
}
@Override
public void onSuccess(int code, File file) {
mButton.setText("下载完成");
mDwonLoadText.setText("下载完成"+apkPath);
}
@Override
public void onFail(int code, File file, String message) {
Log.i(TAG,message);
}
@Override
public void onProgress(int progress) {
mProgressBar.setProgress(progress);
}
});
}
});
}
});
}
}
----------
----------
/**
* 对AsyncTask异步下载的简单封装
* 定义下载方法,传入必要的url path listener参数 在AsyncTask里进行回调
* 定义接口
*/
public class DwonLoadHelper {
public static void dwonLoad(String url ,String FilePath,OnDownLoadListener listener){
DwonloadAsyncTask dwonloadAsyncTask = new DwonloadAsyncTask(url,FilePath,listener);
dwonloadAsyncTask.execute();
}
static class DwonloadAsyncTask extends AsyncTask {
public String mUrl;
public String mFilePath;
public OnDownLoadListener mListener;
public DwonloadAsyncTask(String mUrl, String mFilePath, OnDownLoadListener mListener) {
this.mUrl = mUrl;
this.mFilePath = mFilePath;
this.mListener = mListener;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if(mListener !=null){
mListener.onStart();
}
}
@Override
protected Boolean doInBackground(String... params) {
if(mListener!=null){
try {
//创建URL
URL url = new URL(mUrl);
//创建连接 并打开
URLConnection conn = url.openConnection();
//连接文件的总大小
int contentLength = conn.getContentLength();
//获取文件的输入流
InputStream is = conn.getInputStream();
File file = new File(mFilePath);
//对文件路径做下处理
if(file.exists()){
//如果不为空删除文件
file.delete();
}
//记录已经下载的大小
int downLoadSize =0;
//记录每次下载大小
int len = 0;
//每次下载多少字节
byte[] bytes = new byte[1024];
//创建文件输出流管道
OutputStream os = new FileOutputStream(mFilePath);
//开始下载文件
while ((len = is.read(bytes)) != -1){
//记录每次下载的进度
downLoadSize += len;
os.write(bytes,0,len);
//处理进度条 抛出进度
publishProgress(downLoadSize*100 /contentLength);
}
os.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}else{
mListener.onFail(-2,new File(mFilePath),"文件下载失败");
return false;
}
}
/**
* 此方法执行在主线程中,在异步任务执行完后
* 一般用来操作结果
* @param b
*/
@Override
protected void onPostExecute(Boolean b) {
//更新UI
if(mListener !=null){
mListener.onSuccess(1,new File(mFilePath));
}else{
mListener.onFail(-1,new File(mFilePath),"文件下载失败");
}
}
/**
* 在执行过程中操作进度的改变
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
if(values !=null && values.length>0){
//接受进度
Integer value = values[0];
if(mListener!=null){
mListener.onProgress(value);
}
}
}
}
/**
* 定义接口,定义必要的一些方法回调
*/
public interface OnDownLoadListener {
void onStart();
void onSuccess (int code ,File file);
void onFail(int code, File file, String message);
void onProgress(int progress);
//对接口简单的小优化。有时候不需要用到那么多方法,只定义几个必须要用到的就可以了
//只用成功失败的方法话,在接口调用时,用此类即可
abstract class SimpleDwonLoad implements OnDownLoadListener{
@Override
public void onSuccess(int code, File file) {
}
@Override
public void onFail(int code, File file, String message) {
}
}
}
}
对接口的回调和写法有了一点了解,
可以把一些逻辑代码封装调用接口里的方法处理结果,让回调者在外面处理业务逻辑。