版权声明:未经博主允许不得转载

AsyncTask

了解AsyncTask异步,需要了解一下异步任务(多线程),什么是线程,可以这么说线程好比边吃饭边看电视,AsyncTask是为了方便后台线程中操作更新UI,本质为Handler异步消息处理机制。

学习AsyncTask需要知道它的参数<Params,Progress,Result>,它要实现的方法onPreExcecute(),onPostExecute(),后台线程操作doInBackground();显示进度onProgressUpdate()等方法。在这里混个眼熟,下面会用代码讲一下如何用。

在这里我们创建一个类

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. }
  7. //这里创建一个内部类继承AsyncTask
  8. public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{
  9. }
  10. }

我们在这里点击去看底层AsyncTask

  1. public abstract class AsyncTask<Params, Progress, Result> {
  2. //其中Params为类型参数,Progress为进度,为返回结果
  3. }

在这里继承,实现的方法有

  1. //在异步任务之前
  2. @Override
  3. protected void onPreExecute() {
  4. super.onPreExecute();
  5. // 准备工作
  6. }
  7. @Override
  8. protected Boolean doInBackground(String... strings){
  9. //处理事件
  10. }
  11. @Override
  12. protected void onPostExecute(Boolean aBoolean){
  13. super.onPostExecute(aBoolean);
  14. //执行完,执行结果 处理
  15. }
  16. //当我们的进度在变化的时候
  17. @Override
  18. protected void onProgressUpdate(Integer... values) {
  19. super.onProgressUpdate(values);
  20. //收到进度,然后处理:也是在UI线程中。
  21. }
  22. //取消
  23. /*@Override
  24. protected void onCancelled(Boolean aBoolean) {
  25. super.onCancelled(aBoolean);
  26. }
  27. @Override
  28. protected void onCancelled() {
  29. super.onCancelled();
  30. }*/

在这里通常执行onPreExcecute(执行前),doInBackground(执行中),onPostExecute(执行后),onProgressUpdate这些方法。

在这里写个例子,如何下载一个从网络上下载一个apk,请求网络数据下载文件。在这里我会比较详细地讲解一下如何获取url,以及请求网络的事情。

设置一个点击下载文件的按钮

  1. //定义一个方法
  2. private void setButtonListener(){
  3. mDownloadButton.setOnClickListener(new View.OnClickListener() {
  4. @Override
  5. public void onClick(View v) {
  6. DownloadAsyncTask asyncTask = new DownloadAsyncTask();
  7. asyncTask.execute(APK_URL);
  8. }
  9. });
  10. }

在这里讲解一下,申请asyncTask应用可以理解,就是在创建对象嘛,public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{...},那么这个'execute'还没讲,那就点击进入看一下源码吧~

  1. @MainThread
  2. public final AsyncTask<Params, Progress, Result> execute(Params... params) {
  3. return executeOnExecutor(sDefaultExecutor, params);
  4. }
  5. //通过execute实现

下面就进入执行中的代码

  1. //解释一下这里的Boolean是由这个定义的
  2. public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{
  3. }
  4. //<Params, Progress, Result>
  5. //String... strings 表示数组,可变参数,可能为空
  6. @Override
  7. protected Boolean doInBackground(String... strings){
  8. }

执行前

  1. @Override
  2. protected void onpreExecute(){
  3. super.onPreExecute();
  4. //解决UI问题
  5. }

执行中的代码,进行下载:

  1. //String... 为数组
  2. @Override
  3. protected Boolean doInBackground(String... strings) {
  4. //预防为空
  5. if (strings != null && strings.length>0){
  6. //传入的参数是url,由上面的
  7. // DownloadAsyncTask asyncTask = new DownloadAsyncTask();
  8. //asyncTask.execute(APK_URL);
  9. //决定
  10. String apkurl = strings[0];
  11. try{
  12. //给你一个下载地址url,那么你就要创建一个url对象
  13. URL url = new URL(apkurl);//String apkurl = strings[0];
  14. //构造一个URLConnection 打开连接 url.openConnection()
  15. URLConnection urlConnection = url.openConnection();
  16. //输入流 读取数据
  17. InputStream inputStream = urlConnection.getInputStream();
  18. //接下来获取下载内容的总长度
  19. int contentLength = urlConnction.getContentLength();
  20. //接下来就是找个地方存放,就跟放在目录哪里一下,为字符串
  21. String mFilePath=Environment.getExternalStorageDirectory() + File.separator + FILE_NAME
  22. // Environment.getExternalStorageDirectory() 为目录,比较实用
  23. // File.separator 相当'//'
  24. // FILE_NAME为文件名,可改为“what.apk”.
  25. //对下载地址进行处理
  26. File apkFile = new File(mFilePath);
  27. //接下来就是文件输入到目录中
  28. //先读取再写入
  29. //判断文件
  30. if(apkFile.exists()){
  31. boolean result = apkFile.delete();
  32. if(!result){
  33. return false;
  34. }
  35. }
  36. //文件进度条,已经下载了多少
  37. int downloadSize = 0;
  38. //定义一个读取数组长度,接下来进行。。。
  39. byte[] bytes = new byte[1024];//1024没有规定,可以自己决定
  40. //读取多长
  41. int length;
  42. //创建一个输出流,写
  43. OutputStream outputStream = new FileOutputStream(mFilePath);//写到这个路径
  44. while( (length = inputStream.read(bytes)) != -1){
  45. outputStream.write(bytes,0,length);
  46. downloadSize+=length;
  47. //发送进度
  48. publishProgress();
  49. }
  50. ....
  51. }
  52. }

执行后

  1. @Override
  2. protected void onPostExecute(Boolean aBoolean) {
  3. super.onPostExecute(aBoolean);
  4. //也是在主线程中,执行结果 处理
  5. //处理UI
  6. }

最后进度变化

  1. //当我们的进度在变化的时候
  2. @Override
  3. protected void onProgressUpdate(Integer... values) {
  4. super.onProgressUpdate(values);
  5. if (values != null && values.length >0){
  6. }
  7. }

重点要添加网络权限以及读取权限

  1. <uses-permission android:name="android.permission.INTERNET"/>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

ListView

ListView是我们在Android开发中常用到的一个控件,用来展示数据,我们在微信列表项,文章列表随处可见。

深入了解

  1. public class AppListAdapter extends BaseAdapter{}
  2. public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {}
  3. public interface ListAdapter extends Adapter {}
  4. public interface SpinnerAdapter extends Adapter {}

创建布局

  1. <ListView
  2. android:id="@+id/main_list_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. </ListView>

实现控件声明

  1. private ListView mListView;
  2. mListView=findViewById(R.id.main_list_view);

步骤:了解一下Adapter(适配器)

  1. public class AppListAdapter extends BaseAdapter{
  2. }
  1. //获取包名
  2. String packageName = mAppInfos.get(position).activityInfo.packageName;
  3. ////获取应用名
  4. String className = mAppInfos.get(position).activityInfo.name;
  5. //拼接-点击方法
  6. ComponentName componentName = new ComponentName(packageName,className);
  1. final Intent intent = new Intent();
  2. //通过Intent设置组件名
  3. intent.setComponent(componentName);
  4. startActivity(intent);

BaseAdapter中抽象方法

  1. public int getCount();
  2. public Object getItem(int arg0);
  3. public long getItemId(int arg1);
  4. public View getView(int position, View convertView, ViewGroup parent);
  1. public View getView(int position, View covertView, ViewGroup parent){
  2. if(converView == null){
  3. converView = mInflater.inflate(R.layout.list_item, null);
  4. }
  5. }
  1. static class ViewHolder{
  2. public ImageView image;
  3. public TextView title;
  4. }
  5. @Override
  6. public View getView(int position,view convertView, ViewGroup parent){
  7. ViewHolder holder;
  8. if(convertView == null){
  9. holder = new ViewHolder();
  10. convertView = mInflater.inflate(R.layout.list_item, null);
  11. holder.
  12. holder.
  13. convertView.setTag(holder);
  14. }else{
  15. holder=(ViewHolder)convertView.getTag();
  16. }
  17. }

编辑 :达叔

定位:分享 Android&Java 知识点

Android精通之AsyncTask与ListView讲解的更多相关文章

  1. android高级---->AsyncTask的源码分析

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask,它在子线程更新UI的例子可以参见我的博客(android基础---->子线程更新UI).今天我们通过一个小的案例 ...

  2. Android 多线程----AsyncTask异步任务详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  3. Android使用AsyncTask实现可以断点续传的DownloadManager功能

    http://www.it165.net/pro/html/201211/4210.html 最近做项目卡壳了,要做个Android的应用市场,其他方面都还好说,唯独这个下载管理算是给我难住了,究其原 ...

  4. Android中AsyncTask异步

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  5. Android笔记——AsyncTask介绍

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  6. Android 实现QQ扩展listview(expandlistview)

    Android 实现QQ扩展listview(expandlistview) <?xml version="1.0" encoding="utf-8"?& ...

  7. Android—初识AsyncTask

    AsyncTask是用来处理一些后台的比较耗时的任务,给用户带来良好的体验.AsyncTask扩展Thread,增强了与主线程的交互能力. 首先介绍AsyncTask中定义的以下几个方法: onPre ...

  8. Android 自定义Adapter 但listview 只显示第一条数据

    <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content ...

  9. 详解Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...

随机推荐

  1. 将EditPad Lite 加入鼠标右键

    > 开始 > regedit 如图新建shell及command

  2. Oracle 12导出、导入数据

    Precondition: complete the work described in Oracle 12 创建新的数据库实例.用户 1. export data under user " ...

  3. Java 字符编码(三)Reader 中的编解码

    Java 字符编码(三)Reader 中的编解码 我们知道 BufferedReader 可以将字节流转化为字符流,那它是如何编解码的呢? try (BufferedReader reader = n ...

  4. IDEA高效运用技巧

    windows: //快捷鍵 1.项目之间的切换快捷键:Ctrl+Alt+[]. 2.文件之间切换快捷键:Ctrl+Alt+左右箭头. 3.返回到上一次修改的地方:Ctrl+Q. 4.查找打开过的文件 ...

  5. Finance财务软件帮助

    我们在凭证录入的时候可以使用这些快捷键增加效率: 单元格 快捷键 功能 摘要 F7 弹出摘要选择框 科目 F7 弹出科目选择框 科目 F8 弹出扩展字段编辑界面 金额 Esc/小键盘- 清空 金额 = ...

  6. ES6 Template Strings(转)

    转自:https://developers.google.com/web/updates/2015/01/ES6-Template-Strings Strings in JavaScript have ...

  7. mysql 跨服务器查询

    转载地址:https://blog.csdn.net/pashine/article/details/78875540

  8. java Quartz任务调度器

    1.quarz对java1.5实现的简单调度做了封装 /**     * quartz对任务调度进了高度抽象: 1调度器:2任务:3触发器     * Job接口(任务):定义需要调度的任务     ...

  9. LinkedList - 好一个双向链表

    LinkedList是常用的集合结构之一,数据存储结构为链式存储,每个节点都有元素.前指针和后指针,指针指向了前节点和后节点的位置.同是LinkedList也是一个队列,实现了Deque接口,Dequ ...

  10. 20175316盛茂淞 2018-2019-2 《Java程序设计》第9周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第9周学习总结 教材学习内容总结 下载安装MySQL数据库管理系统. 学习<Java程序设计>第十一章MyS ...