AsyncTask的学习
来源:互联网 发布:手机淘宝白夜追凶视频 编辑:程序博客网 时间:2024/06/05 10:53
一周没学习,累觉不爱,周一新刀到手,结果就把手指给切了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,Integer,Boolean>{ //获取文件存储的路径 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<String,Integer,Boolean> { 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) { } } }}
对接口的回调和写法有了一点了解,
可以把一些逻辑代码封装调用接口里的方法处理结果,让回调者在外面处理业务逻辑。
阅读全文
0 0
- AsyncTask的初步学习
- AsyncTask的学习
- [Android] AsyncTask 的学习
- AsyncTask的学习
- AsyncTask的学习
- AsyncTask的学习
- Android AsyncTask异步的学习
- AsyncTask 学习
- AsyncTask学习
- AsyncTask 学习
- asynctask学习
- AsyncTask学习
- AsyncTask学习
- AsyncTask 学习
- AsyncTask学习
- AsyncTask学习
- android中关于AsyncTask的学习
- android学习日记:AsyncTask的运用
- Filter的十种特效
- 关于测试基础问题
- How do I connect to multiple wifi networks?
- python注释
- 【微信小程序 四】二维码生成/扫描二维码
- AsyncTask的学习
- 学习爬虫基础3-urllib2库的基本使用
- Java提高篇——单例模式
- python爬虫--BeautifulSoup
- Android 简单 相对布局的实现;
- 字符串指针常见错误。
- 【C语言】计算指定日期是一年中第几天
- 【C语言】求素数
- python变量类型及标识符