Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android精通之AsyncTask与ListView讲解

Android精通之AsyncTask与ListView讲解

作者头像
达达前端
发布于 2019-07-03 04:21:36
发布于 2019-07-03 04:21:36
53000
代码可运行
举报
文章被收录于专栏:达达前端达达前端
运行总次数:0
代码可运行

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

标题图

AsyncTask

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

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

在这里我们创建一个类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
 //这里创建一个内部类继承AsyncTask
 public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{

 }

}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class AsyncTask<Params, Progress, Result> {
//其中Params为类型参数,Progress为进度,为返回结果
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//在异步任务之前
@Override
protected void onPreExecute() {
     super.onPreExecute();
     // 准备工作
           
}

@Override
protected Boolean doInBackground(String... strings){
 //处理事件
}

@Override
protected void onPostExecute(Boolean aBoolean){
 super.onPostExecute(aBoolean);
 //执行完,执行结果 处理
}

//当我们的进度在变化的时候
@Override
 protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
     //收到进度,然后处理:也是在UI线程中。
}

//取消
/*@Override
protected void onCancelled(Boolean aBoolean) {
     super.onCancelled(aBoolean);
}

@Override
protected void onCancelled() {
    super.onCancelled();
}*/

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//定义一个方法
private void setButtonListener(){
 mDownloadButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               DownloadAsyncTask asyncTask = new DownloadAsyncTask();
               asyncTask.execute(APK_URL);
            }
    });
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@MainThread
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
       return executeOnExecutor(sDefaultExecutor, params);
}
//通过execute实现

下面就进入执行中的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//解释一下这里的Boolean是由这个定义的
public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{
}

//<Params, Progress, Result>
//String... strings 表示数组,可变参数,可能为空
@Override
protected Boolean doInBackground(String... strings){

}

执行前

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onpreExecute(){
  super.onPreExecute();
 //解决UI问题
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//String... 为数组
@Override
protected Boolean doInBackground(String... strings) {
  //预防为空
  if (strings != null && strings.length>0){
     //传入的参数是url,由上面的
     // DownloadAsyncTask asyncTask = new DownloadAsyncTask();
     //asyncTask.execute(APK_URL);
     //决定
     String apkurl = strings[0];
     try{
      //给你一个下载地址url,那么你就要创建一个url对象
      URL url = new URL(apkurl);//String apkurl = strings[0];
      //构造一个URLConnection 打开连接 url.openConnection()
      URLConnection urlConnection = url.openConnection();

     //输入流 读取数据
     InputStream inputStream = urlConnection.getInputStream();
     //接下来获取下载内容的总长度
     int contentLength = urlConnction.getContentLength();

     //接下来就是找个地方存放,就跟放在目录哪里一下,为字符串
     String mFilePath=Environment.getExternalStorageDirectory() + File.separator + FILE_NAME// Environment.getExternalStorageDirectory() 为目录,比较实用
// File.separator 相当'//'
// FILE_NAME为文件名,可改为“what.apk”.

//对下载地址进行处理

File apkFile = new File(mFilePath);
//接下来就是文件输入到目录中
//先读取再写入
//判断文件
if(apkFile.exists()){
 boolean result = apkFile.delete();

 if(!result){
  return false;
 }

}

//文件进度条,已经下载了多少
int downloadSize = 0;

//定义一个读取数组长度,接下来进行。。。
byte[] bytes = new byte[1024];//1024没有规定,可以自己决定
//读取多长
int length;
//创建一个输出流,写
OutputStream outputStream = new FileOutputStream(mFilePath);//写到这个路径

while(  (length = inputStream.read(bytes)) != -1{
 outputStream.write(bytes,0,length);
 downloadSize+=length;
 //发送进度
 publishProgress();
}
....
  }
}

执行后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onPostExecute(Boolean aBoolean) {
 super.onPostExecute(aBoolean);
 //也是在主线程中,执行结果 处理
 //处理UI
}

最后进度变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//当我们的进度在变化的时候
@Override
protected void onProgressUpdate(Integer... values) {
 super.onProgressUpdate(values);
 if (values != null && values.length >0){
 }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

ListView

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

深入了解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AppListAdapter extends BaseAdapter{}

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {}

public interface ListAdapter extends Adapter {}

public interface SpinnerAdapter extends Adapter {}

创建布局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ListView
 android:id="@+id/main_list_view"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
</ListView>

实现控件声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private ListView mListView;
mListView=findViewById(R.id.main_list_view);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AppListAdapter extends BaseAdapter{
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取包名
String packageName = mAppInfos.get(position).activityInfo.packageName;
////获取应用名
String className = mAppInfos.get(position).activityInfo.name;
//拼接-点击方法
ComponentName componentName = new ComponentName(packageName,className);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final Intent intent = new Intent();
//通过Intent设置组件名
intent.setComponent(componentName);
startActivity(intent);

BaseAdapter中抽象方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int getCount();
public Object getItem(int arg0);
public long getItemId(int arg1);
public View getView(int position, View convertView, ViewGroup parent);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public View getView(int position, View covertView, ViewGroup parent){
 if(converView == null){
   converView = mInflater.inflate(R.layout.list_item, null);
  }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static class ViewHolder{
 public ImageView image;
 public TextView title;
}

@Override
public View getView(int position,view convertView, ViewGroup parent){
 ViewHolder holder;

 if(convertView == null){
  holder = new ViewHolder();
  convertView = mInflater.inflate(R.layout.list_item, null);
  holder.
  holder.
   convertView.setTag(holder);
 }else{
   holder=(ViewHolder)convertView.getTag();
 }

}

编辑 :达叔

信箱:2397923107@qq.com

定位:分享 Android&Java 知识点

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AsyncTask解析
需要进度更新: onPreExecute() --> doInBackground() --> publishProgress() --> onProgressUpdate() --> onPostExecute()
用户1205080
2019/04/25
6600
Android | AsyncTask基础梳理
AsyncTask. 异步任务 目的:方便后台线程中操作后更新UI 封装并简化了异步操作 实现:Thread和Handler进行了封装 实质:Handler异步消息处理机制 参数是泛型:<Params,Progress,Result> UI操作:onPreExecute,onPostExecute 后台线程操作 doInBackground 输入输出:Params(入),Result(出) 进度显示:onProgressUpdate ANR(Application Not Responding)
凌川江雪
2019/11/12
6340
Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html 一、AsyncTask的使用 AsyncTask是一种轻量级的异步任务类,可以很方便的在线程池中执行异步任务,并且将进度和结果传递给主线程。其底层由Thread+handler实现。 AsyncTask是一个抽象的泛型类,其类的声明如下: public abstract class AsyncTask<Params, Progress, Result> 其中三个泛型
codingblock
2018/03/30
1.1K0
锦囊篇|一文摸懂AsyncTask
一般我们在代码中只用执行excute()的函数,在各个函数流程中给出相对应的操作。
ClericYi
2020/07/24
4500
锦囊篇|一文摸懂AsyncTask
AsyncTask源码深入解析
最近想写一篇关于源码解析的文章,发现AsyncTask代码量不多,可里面的东西却是很值得学习的,所以故那这来“开刀”
HelloJack
2018/08/28
4520
AsyncTask源码深入解析
AsyncTask 使用及封装实践
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/57409326
程序员徐公
2018/09/18
9860
AsyncTask 使用及封装实践
Android AsyncTask实现原理和使用技巧分享
我们写App都有一个原则,主线程不能够运行需要占用大量CPU时间片的任务,如大量复杂的浮点运算,较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝,甚至ANR,这些会使应用的用户体验变差,但是有时又的确需要执行这些耗时的任务,那么我们通常可以使用AsyncTask或者new Thread 来处理,这样把任务放入工作线程中执行,不会占用主线程的时间片,所以主线程会及时响应用户的操作,如果使用new Thread来执行任务,那么如果需要中途取消任务执行或者需要返回任务执行结果,就需要我们自己维护很多额外的代码,而AsyncTask是基于concurrent架包提供的并发类实现的,上面的二个需求都已经帮我们封装了,这也是我们选择AsyncTask的原因。
三好码农
2018/09/11
8230
【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )
AsyncTask 构造函数作用 : 创建一个新的异步任务 , 该构造函数必须在 UI 主线程调用 ;
韩曙亮
2023/03/28
9640
asynctask使用_androidstudiohelloworld教程
这是Google Android 开发文档上关于AsyncTask的介绍,大概意思是AsyncTask设计为一个对于Thread和Handle的辅助类,主要让开发者方便的使用UI Thread和后台Thread的操作( 比如在后台线程下载文件,同时要在UI线程更新下载进度 )。同时这不是一个通用的多线程编程框架,他被设计为用于能够在 最多几秒的时间内返回结果的任务。
全栈程序员站长
2022/08/04
3890
Android 多线程的几种方式
如果您的App没有明确指定屏幕方向和configChanges时,当用户旋转屏幕的时候Activity就会重新启动,而这个时候您的异步加载数据的线程可能正在请求网络。当一个新的Activity被重新创建之后,就又重新启动了一个新的任务去请求网络,这样之前的一个异步任务不经意间就泄露了,假设你还在onPostExecute写了一些其他逻辑,这个时候就会发生意想不到异常。
码客说
2019/10/22
8590
Android多线程:AsyncTask使用教程(含实例讲解)
前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 Handler AsyncTask HandlerThread 今天,我将献上一份AsyncTask使用教程,希望大家会喜欢 Carson带你学多线程系列 基础汇总 Android多线程:基础知识汇总 基础使用 Android多线程:继承Thread类使用(含实例教程) Android多线程:实现Runnable接口使用(含实例教程) 复合使用 Android多线程:As
Carson.Ho
2022/03/25
9380
Android多线程:AsyncTask使用教程(含实例讲解)
AsyncTask源码解析
导语 AsyncTask对Android开发者来说并不陌生,当有耗时任务并涉及UI交互,AsyncTask可是处理异步任务的利器。AsyncTask使用也很方便,开发的时候多留意不要内存泄漏,一般处理方法就是把AsyncTask写成静态内部类的形式。 使用方法 new AsyncTask<Integer, Integer, Boolean>() { private int NUM = 0; @Override protected void
用户1269200
2018/02/01
8370
Android 多线程-----AsyncTask详解
本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。
杨奉武
2018/09/27
6360
Android 多线程-----AsyncTask详解
【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )
① 获取 JobScheduler 服务 : 从 Context 对象中 , 调用 getSystemService 方法跨进程获取 ;
韩曙亮
2023/03/28
1.4K0
Android 多线程:这是一份详细的AsyncTask使用教程
下面,我将用1个实例讲解 具体如何使用 `AsyncTask`
Carson.Ho
2019/02/22
1.4K1
安卓异步任务AsyncTask
       Android4.0之后,网络访问这些都是要放在自己开的线程里,然后在主线程里进行访问的。就我所知的有两种方法。一种是自己new一个线程,然后通过Handler机制进行访问;另外一种是用异步任务AsyncTask的方法。
SmileNicky
2019/01/17
5230
Android开发笔记(四十九)异步任务处理AsyncTask
Thread+Handler方式虽然能够实现多线程的通信处理,但是写起代码来颇为繁琐,所以Android提供了AsyncTask这样一个轻量级的异步任务类,其内部封装好Thread+Handler,方便了码农的工作,类似已封装好的多线程处理类还有IntentService(具体见《Android开发笔记(四十一)Service的生命周期》)。AsyncTask适用于HTTP通信,包括下载、http调用等等。 AsyncTask是个模板类(AsyncTask<Params, Progress, Result>),继承它的新类需要指定模板的参数类型,模板参数说明如下: Params : 任务启动时的输入参数,比如http访问的url、请求参数等等。可设置为String类型或者自定义的数据结构 Progress : 任务执行的进度。可设置为Integer类型 Result : 任务执行完的结果。可设置为String类型或者自定义的数据结构 下面是要重写的方法,不能直接调用: doInBackground : 异步处理操作都放在该方法中,params参数对应execute方法的输入参数。该方法运行于分线程,所以不能操作UI,其他方法都能操作UI onPreExecute : 在doInBackground执行之前调用 onProgressUpdate : doInBackground方法中调用publishProgress时会触发该方法,通常用于处理过程中刷新进度条 onPostExecute : 在doInBackground执行完毕时调用,通常用于处理完毕后刷新展示页面 onCancelled : doInBackground方法中调用cancel时会触发该方法 下面是可直接调用的方法: execute : 开始执行异步处理任务。 executeOnExecutor : 以指定线程池模式开始执行任务。THREAD_POOL_EXECUTOR表示异步线程池,SERIAL_EXECUTOR表示同步线程池。默认是SERIAL_EXECUTOR。 publishProgress : 更新进度。该方法只能在doInBackground方法中调用,调用后会触发onProgressUpdate方法。 cancel : 取消任务。该方法调用后,doInBackground的处理立即停止,并且接着调用onCancelled方法,而不会调用onPostExecute方法。 get : 获取处理结果。 getStatus : 获取任务状态。PENDING表示还未执行,RUNNING表示正在执行,FINISHED表示执行完毕 isCancelled : 判断该任务是否取消。true表示取消,false表示未取消
aqi00
2019/01/18
1.1K0
Android多线程-AsyncTaskyi(一)
今天分析android的异步线程类HandlerThread与IntentService,它们都是android系统独有的线程类,而android中还有另一个比较重要的异步线程类AsyncTask。本文我们就来分析AsyncTask。
用户9253515
2021/12/08
7310
android异步任务asyntask详解
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。 为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得
xiangzhihong
2018/01/30
1.1K0
android异步任务asyntask详解
AsyncTask和Handler对比
1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l  简单,快捷 l  过程可控 使用的缺点: l  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Looper,
欢醉
2018/01/22
1.3K0
相关推荐
AsyncTask解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验