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,一经查实,立即删除!

相关文章

python gil锁存在的意义_关于python的GIL全局解释器锁的简单理解

GIL是解释器内部的一把锁,确切一点说是CPython解释器内部的一把锁,所以要注意区分 这和我们在Python代码中使用线程锁Lock并不是一个层面的概念。1. GIL产生的背景:在CPython解释内部运行多个线程的时候,每个线程都需要解释器内部申请相应的全…

打破了vs你错了

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

php魔术变量的概念_PHP 魔术变量和魔术函数详解

魔术变量PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。…

android studio on/off 切换开关,如何使用android studio中的开关小部件来启用/禁用函数()?...

试试这个:import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JRadioButton;public class test {public static volatile boolean activated false;public test() {JFrame q new JFrame();q.…

javabeans_(单元测试)JavaBeans的技巧

javabeans如果您正在编写Java代码,那么您至少要编写一些遵循JavaBean约定的类,即,具有带有公共getter和setter方法的私有属性的类,包含无参数的构造函数,可序列化,并且遵守Equals和HashCode合同。 最重要的…

8分钟答辩稿_5分钟学会8个答辩小套路,教资面试没在怕的啦!

注意!1.笔试成绩查询时间官方给出的时间是12月10日,但是根据往年情况,一般时间都会提前,12月9日下午极有可能开通查询,所以大家要准备好哦~现在进入教资【成绩查询微信群】,老师都会第一时间发布通知&#…

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.简介 …

android sdcard 压缩图片,android如何往SDCard中存取图片

import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.graphics.Bitmap;import android.os.Environment;import android.util.Log;/*** 保存图片的类***/public class SaveBitmap {private f…

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

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

c# opencv 轮廓检测_C#中OpenCVSharp实现轮廓检测

OpenCv提供了函数 findContours()用于对物体轮廓进行检测,该函数实现算法是由S.suzuki K.Abe于1985年发表的。OpenCVSharp封装了这个函数,有2个参数(contours,hierarchy)要做特别的说明。public static void FindContours(InputOutputArray i…

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

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

linux nat冲突,Linux系统下的NAT及防火墙的混合应用

2011-11-28 13:03朋友你好!我刚开始搞linux,碰到了很多问题,想问你下,希望能帮我解答下。下面是我的一段shell 程序#!/bin/shwhile [ 0 ]doread scoreif [ $score -lt 60 ];thenecho " you must work hard!"…

外贸常用术语_13个常用的国际贸易术语详解

原标题:13个常用的国际贸易术语详解做外贸的我们一定要详细的了解外贸运输术语的含义,每一个术语买卖双方所需承担的责任与义务。这样能够更好的区分买卖双方该承担履行的责任与义务。很多时候我们只是知道我们日常经常用到的,其他的还是不是…

卡夫卡–一次语义学

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

android 打印机蜂鸣器,CANON喷墨打印机 蜂鸣器响5声不打印的问题解决办法

CANON喷墨打印机 蜂鸣器响5声不打印的问题解决办法通常我们如果遇到CANON打印机蜂鸣器响5声即表示废墨仓满,一般都可以通过按键且使用02、03、05墨盒的机型按下面方法操作:同时按住左、右两键,插入电源,然后松开两键;按…

python病毒usb文件自动安装_win7禁USB自动安装驱动功能避免木马病毒入侵

用户在限制USB设备使用方面,首先考虑的就是禁止其自动播放,以避免木马病毒入侵,但很多时候,这样的方法并不是很有效。如果你是Win7用户,那就可以通过它独有的“权限控制”技术,从源头上控制USB设备的自动运…