资讯专栏INFORMATION COLUMN

Android精通之AsyncTask与ListView讲解

番茄西红柿 / 819人阅读

摘要:学习需要知道它的参数,它要实现的方法,,后台线程操作显示进度等方法。在这里混个眼熟,下面会用代码讲一下如何用。取消在这里通常执行执行前,执行中,执行后,这些方法。在这里我会比较详细地讲解一下如何获取,以及请求网络的事情。

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

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 {}

创建布局


实现控件声明

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2975.html

相关文章

  • AndroidListViewAsyncTask,GridView,CardView,本地数据存

    摘要:支持数据安全性高,空间大小有限与之相反。在关系型数据库中,二维表中的列为属性,称为字段行为记录,如一对象属性中字段取值范围称为域。 版权声明:未经博主允许不得转载 补充 补充上一节,使用ListView是用来显示列表项的,使用ListView需要两个xml文件,一个是列表布局,一个是单个列表项的布局。如我们要在要显示系统所有app列表项时,需要左边appimage视图和右边文本视图。 一...

    AlphaWatch 评论0 收藏0
  • 分享一份非常强势的Android面试题

    摘要:马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助和区别参考链接既然在很多方面能取代,为什么没把划上一条过时的横线答案可以沿着回收机制来回答。静态内部类的设计意图。 马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助! ListView和RecyclerView区别 参考...

    opengps 评论0 收藏0
  • Android精通:ViewViewGroup,LinearLayout线性布局,Relative

    摘要:在中提供了几个常用布局线性布局相对布局帧布局绝对布局表格布局网格布局描述一下几个重要的线性布局指子控件以水平或垂直方式排列。帧布局指所有子控件均放在左上角且后面元素直接覆盖在前面元素之上。 UI的描述 对于Android应用程序中,所有用户界面元素都是由View和ViewGroup对象构建的。View是绘制在屏幕上能与用户进行交互的一个对象。而对于ViewGroup来说,则是一个用于存放其他...

    Xufc 评论0 收藏0
  • AsyncTask 和 Thread+Handler 的比较

    摘要:之所以说它轻量级,是因为缺少了直接使用的灵活性。如果是很复杂的操作,还是建议通过来操作,然后通过的方式来更新。 首先 : AsyncTask 和 Thread+Handler 的比较: 1.AsyncTask实现的原理和适用的优缺点AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程...

    shuibo 评论0 收藏0
  • 金三银四,2019大厂Android高级工程师面试题整理

    摘要:原文地址游客前言金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。 最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是走上编程之路,将来你要学不仅仅是这些,丰富自己方能与世接轨,做好全栈的装备。 原文地址:游客kutd...

    沈建明 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<