android listview asynctask,Android精通之AsyncTask与ListView讲解

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

6d42cf7ff707

标题图

AsyncTask

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

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

在这里我们创建一个类

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{

}

}

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

public abstract class AsyncTask {

//其中Params为类型参数,Progress为进度,为返回结果

}

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

//在异步任务之前

@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,以及请求网络的事情。

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

//定义一个方法

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{...},那么这个'execute'还没讲,那就点击进入看一下源码吧~

@MainThread

public final AsyncTask execute(Params... params) {

return executeOnExecutor(sDefaultExecutor, params);

}

//通过execute实现

下面就进入执行中的代码

//解释一下这里的Boolean是由这个定义的

public class DownloadAsyncTask extends AsyncTask{

}

//

//String... strings 表示数组,可变参数,可能为空

@Override

protected Boolean doInBackground(String... strings){

}

执行前

@Override

protected void onpreExecute(){

super.onPreExecute();

//解决UI问题

}

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

//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();

}

....

}

}

执行后

@Override

protected void onPostExecute(Boolean aBoolean) {

super.onPostExecute(aBoolean);

//也是在主线程中,执行结果 处理

//处理UI

}

最后进度变化

//当我们的进度在变化的时候

@Override

protected void onProgressUpdate(Integer... values) {

super.onProgressUpdate(values);

if (values != null && values.length >0){

}

}

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

ListView

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

深入了解

public class AppListAdapter extends BaseAdapter{}

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {}

public interface ListAdapter extends Adapter {}

public interface SpinnerAdapter extends Adapter {}

创建布局

android:id="@+id/main_list_view"

android:layout_width="match_parent"

android:layout_height="match_parent">

实现控件声明

private ListView mListView;

mListView=findViewById(R.id.main_list_view);

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

public class AppListAdapter extends BaseAdapter{

}

//获取包名

String packageName = mAppInfos.get(position).activityInfo.packageName;

获取应用名

String className = mAppInfos.get(position).activityInfo.name;

//拼接-点击方法

ComponentName componentName = new ComponentName(packageName,className);

final Intent intent = new Intent();

//通过Intent设置组件名

intent.setComponent(componentName);

startActivity(intent);

BaseAdapter中抽象方法

public int getCount();

public Object getItem(int arg0);

public long getItemId(int arg1);

public View getView(int position, View convertView, ViewGroup parent);

public View getView(int position, View covertView, ViewGroup parent){

if(converView == null){

converView = mInflater.inflate(R.layout.list_item, null);

}

}

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();

}

}

编辑 :达叔

定位:分享 Android&Java 知识点

我是简书的达叔小生。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打破了vs你错了

为微服务构建REST API时,需要做出一些关于响应的设计决策。 某些响应显然是微服务周围协议的产物–例如3xx代码之类的东西都与重定向和路由有关。 通常,您将尝试获取正确的2xx代码以取得成功。 如有疑问,将为200(确定&#xff09…

android lable标签,android:label说明

文章目录1. 说明android:label 用于app 在切换activity的时候,自动更换左上角的显示2. 代码架构3. String.xml 字符串资源文件My Application主界面 labsecond 界面 lab4. AndroidMainfest.xmlpackage"com.example.myapplication">android:allowBackup"true&…

Neo4J OGM与Quarkus

在下面的视频中,我演示了一个使用Neo4J数据库和Neo4J OGM的Quarkus应用程序示例。 看一下GitHub上的示例项目 。 我为咖啡豆创建了一个示例域,其中包含我们可以查询和匹配的某些风味配置文件。 红色节点是来自某个国家/地区的咖啡豆,味道像…

鸿蒙os内测版应用名称,谁知道报名鸿蒙系统公测,应用名称怎么填的?

[分享交流]谁知道报名鸿蒙系统公测,应用名称怎么填的?92209电梯直达huafen327001442初窥门径发表于 2020-12-18 21:17:21来自:HUAWEI Mate 30 Pro 5G最新回复 2020-12-26 21:47:39Screenshot_20201218_210913_com.tencent.mm_edit_1719993392…

命令模式应用_命令设计模式的应用

命令模式应用嗨,您好! 今天,我将与您分享一种非常出色的编程设计模式。 它有很多用法,是我的最爱之一。 编程设计模式命令具有多种用例。 在这篇文章中,我们将看到如何实现来自现实世界的东西。 我们将使用电子汽车钥…

Java XMPP负载测试工具

在本文中,我们将开发用Java编写的XMPP负载测试工具。 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1。 创建一个新的Maven项目 4.2。 创建主类 4.3。 XmppManager类 4.4。 建立 4.5。 负载测试 5.总结 6.参考 7.下载Maven项目 1.简介 …

python get()函数_C++使用ffpython嵌入和扩展python(python2和python3)

C使用ffpython嵌入和扩展python(python2和python3)摘要:在服务器编程中,经常会用到python脚本技术。Python是最流行的脚本之一,并且python拥有定义良好的C API接口,同时又有丰富的文档,与C结合非常的适合。…

鸿蒙系统的挑战,简单的讲解下何为鸿蒙系统,可能会挑战你的认知颠覆你的想象...

本帖最后由 一梦盛夏 于 2020-12-2 17:33 编辑这篇文章可能会颠覆你的想象,挑战你的认知,请耐心阅读。今天不说专业术语,全部用比喻方式来聊,这样会更明白一些,也欢迎大家一起来讨论。首先,我们先聊聊何为鸿…

卡夫卡–一次语义学

在分布式环境中,故障是很常见的情况,可以随时发生。 在Kafka环境中,代理可能会崩溃,网络故障,处理故障,发布消息时失败或无法使用消息等。这些不同的场景引入了不同类型的数据丢失和重复。 失败场景 A&am…

akka的介绍_Akka笔记–演员介绍

akka的介绍过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它开始很简单,一旦您开始看到性能改进,它就会变得非常有趣。 但是,当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中…

使用模拟进行测试

如果使用正确的方法,模拟对象将非常有用。 我在需要驱动软件开发使用的帖子中分享了一些使用Mock Objects的经验。 在这篇文章中,我分享了两件事 –使用模拟进行基于合同的测试。 –用于组织模拟代码的模式。 基于合同的测试 让我们以正在构建汇款服…

aws s3 獲取所有文件_AWS SA associate 证书考试学习记录-EBS,S3,EFS比较

我们的目标,就是花最少的时间,学到最多的东西:-)在AWS中,可以选择的存储服务很多,纷繁复杂,新手根本弄不清楚选择哪个。因为做为一个云架构师,你并不是让你的产品能用就够了&#xf…

html设置顶部对齐,HTML / CSS文本从div顶部对齐

首先,你需要修复你的CSS选择器 .你可以通过这种方式t write all those id .#content #main #services只需选择1个元素和他的孩子 .例如,如果你测试它,它将适用于你:#services .langelis .txt {width: 440px;height: auto;float: l…

hot编码 字符one_One Hot编码是什么?为什么要用它,什么时候用它?

作者:Rakshith Vasudev编译:ronghuaiyang导读当你在玩ML模型的时候,你会在任何地方遇到这个“One hot encoding”的术语。当你在玩ML模型的时候,你会在任何地方遇到这个“One hot encoding”术语。你可以看到一个one hot编码器的s…

CUBA 7.2 –有什么新功能?

CUBA平台的第七版向前迈出了一大步。 内部体系结构的改进和新的IDE为进一步改进奠定了良好的基础。 我们将继续添加新功能,以使开发人员的生活更轻松,并使他们的工作更加高效。 在7.2版中,我们引入了许多可能看起来像是主要更新的更改&#…

postgresql 分区视图_PostgreSQL架构集中式到分布式主流架构总结

文章目录一、PG未来主流架构为什么是分布式二、PostgreSQL集中式到分布式架构总结一、PG未来主流架构为什么是分布式如果说5年前DB的分布式还只是一种趋势,如今分布式数据库正逐渐从趋势变成主流。说到分布式,我想我们不能不提一下集中式和分库分表。01集…

html5 上传图片模板,HTML5实现图片文件异步上传

,过现前个能文使近记接的端问对字用近记接  利用HTML5的新特点做文件异步上传非常简单方便,本文主要展示JS部分,html结构。下面的代码并未使用第三发库,如果有参照,请注意一些未展现出来的代码片段。我这边的效果预览…

html中可以有两个h1,在一个HTML中h1标签能出现几次?h1标签和标题标签

首页 > web前端 > html教程 > 正文 在一个HTML中h1标签能出现几次?h1标签和标题标签的差别是什么? 2018-08-29 10:57:28本篇文章主要介绍了关于HTML h1标签的一些解释,有html h1标签和html title标签的区别,还有网页中h1…

Java中的记录类型

2020年3月发布的JDK 14引入了记录 (预览语言功能),这些记录提供了一种紧凑的语法来声明主要用于保存数据的类。 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访问器和通用方法,例…

山东省102021年普通高考成绩查询,山东高考成绩今日发布!成绩查询看这里!

原标题:山东高考成绩今日发布!成绩查询看这里!山东高考生注意啦~今天16:20举行山东2020年夏季高考第二次新闻发布会届时将会公布高考录取政策、分数线情况等今天17:00公布2020夏季高考与等级考成绩发布会怎么看?高考成绩怎样查&am…