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

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<String,Integer,Boolean>{ } }

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

public abstract class AsyncTask<Params, Progress, Result> {
//其中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<String,Integer,Boolean>{...},那么这个'execute'还没讲,那就点击进入看一下源码吧~

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

下面就进入执行中的代码

//解释一下这里的Boolean是由这个定义的
public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{
} //<Params, Progress, Result>
//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){
}
}

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

<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开发中常用到的一个控件,用来展示数据,我们在微信列表项,文章列表随处可见。

深入了解

public class AppListAdapter extends BaseAdapter{}

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {}

public interface ListAdapter extends Adapter {}

public interface SpinnerAdapter extends Adapter {}

创建布局

<ListView
android:id="@+id/main_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>

实现控件声明

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 知识点

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. Collection<T> 的一个坑

    当前所在的公司偏好使用 Collection<T>(System.Collections.ObjectModel), 这货比起List<T>不仅少了很多实用方法, 而且还有一个 ...

  2. 微信小程序实战[01]

    接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...

  3. 第一次面试经历(hr面)

    经过介绍,我有幸去到一家国际背景的广告公司面试前端开发实习生.收到的邮件是复试通知,看来我已经跳过了第一轮面试. 来到hr请我进了一个小间坐下里填求职书,里面有各种个人信息,有兴趣爱好,有工作经历,以 ...

  4. [DP][NOIP2013]花匠

    花匠 问题描述: 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. ...

  5. python学习心得--编码格式篇

    计算机容量单位: 1位 = 1bit: 8bit = 1byte = 1字节 : 1024bytes = 1kbytes =1KB: 1024KB = 1Million Bytes = 1MB = 1 ...

  6. nginx集成环境下载

    https://visual-nmp.en.softonic.com/download

  7. linux jdk 环境变量

    一.jdk的安装 1.下载 jdk-7u79-linux-i586.tar.gz 2.tar -zxvf jdk-7u79-linux-i586.tar.gz  解压 3.mv jdk1.7.0_79 ...

  8. [c#.net]遍历一个对象中所有的属性和值

    利用反射 SpDictItem sp = GetCFHObject.GetSpItem("); PropertyInfo[] propertys = sp.GetType().GetProp ...

  9. 别人的Linux私房菜(21)基础系统设置与备份策略

    网络设置,手动设置IP,DHCP自动获取. 以太网协议开发出来的网卡ethN,N为数字. CentOS7对网卡命名的规则:eno代表由主板BIOS内建立的网卡,ens1由主板BIOS内建的PCI-E界 ...

  10. 渗透测试的理论部分4——开放式Web应用程序安全项目

    开放式Web应用程序安全项目(Open Web Application Security Project OWASP) 定期退出Top 10 project(排名前十的安全隐患防守规则) 公开了编写安 ...