博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android精通之AsyncTask与ListView讲解
阅读量:5811 次
发布时间:2019-06-18

本文共 5655 字,大约阅读时间需要 18 分钟。

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

AsyncTask

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

学习AsyncTask需要知道它的参数<Params,Progress,Result>,它要实现的方法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为进度,为返回结果}复制代码

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

//在异步任务之前@Overrideprotected void onPreExecute() {     super.onPreExecute();     // 准备工作           }@Overrideprotected Boolean doInBackground(String... strings){ //处理事件}@Overrideprotected void onPostExecute(Boolean aBoolean){ super.onPostExecute(aBoolean); //执行完,执行结果 处理}//当我们的进度在变化的时候@Override protected void onProgressUpdate(Integer... values) {    super.onProgressUpdate(values);     //收到进度,然后处理:也是在UI线程中。}//取消/*@Overrideprotected void onCancelled(Boolean aBoolean) {     super.onCancelled(aBoolean);}@Overrideprotected 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<String,Integer,Boolean>{...},那么这个'execute'还没讲,那就点击进入看一下源码吧~

@MainThreadpublic final AsyncTask
execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params);}//通过execute实现复制代码

下面就进入执行中的代码

//解释一下这里的Boolean是由这个定义的public class DownloadAsyncTask extends AsyncTask
{}//
//String... strings 表示数组,可变参数,可能为空@Overrideprotected Boolean doInBackground(String... strings){}复制代码

执行前

@Overrideprotected void onpreExecute(){  super.onPreExecute(); //解决UI问题}复制代码

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

//String... 为数组@Overrideprotected 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();}....  }}复制代码

执行后

@Overrideprotected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); //也是在主线程中,执行结果 处理 //处理UI}复制代码

最后进度变化

//当我们的进度在变化的时候@Overrideprotected 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 {}复制代码

创建布局

复制代码

实现控件声明

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;}@Overridepublic 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 知识点

你可能感兴趣的文章
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
九叔Xen App测试报告
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
Http、TCP/IP协议与Socket之间的区别(转载)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
vrpie在Visio Studio 中无法调试的问题
查看>>