asynctask相关知识
-
AsyncTask源码分析简介有些时候,需要将任务放在子线程执行,执行完成后在主线程更新UI等,遇到这种情况,我们可以用线程间通信来解决,比如Thread+hander的方式,但是这种需要我自己去完成通信的逻辑,有读者立马会想起,使用Android系统的自带的AsyncTask来实现,但是你知道不同Android版本AsyncTask有什么不同,已经使用AsyncTask有什么问题,需要注意什么吗?下面我将从源码的角度给大家讲解,AsyncTask的实现和优缺点。AsyncTask简化模型可以看成是:线程池+Handler,线程池执行耗时的后台任务,Handler处理UI交互。AsyncTask串行和并行android 1.5以前的时候execute是串行执行的android 1.6直到android 2.3.2被修改为并行执行,执行任务的线程池就是THREAD_POOL_EXECUTORandroid 3.0以后,默认任务是串行执行的,如果想要并行执行任务可调用executeOnExecutor(Executor exec, Pa
-
异步任务 AsyncTask为什么要异步任务 android单线程模型。 耗时操作放在非主线程中执行。 AsyncTask为何而生 子线程中更新UI。 封装,简化异步操作。 构建AsyncTask子类的参数 AsyncTask<Params,Progress,Result>是一个抽象类,通常用于别继承。 Params:启动任务是输入的参数类型。 Progress:后台任务执行中返回进度值的类型。 Result:后台执行任务完成后返回结果的类型。 构建AsyncTask子类的回调方法 doInBackground:必须重写,异步执行后台线程将要完成的任务。 onPreExecute:执行后台耗时操作
-
Android内存泄漏剖析之AsyncTask泄漏原因 一个常见的内存泄漏错误是AsyncTask有Activity或者Fragment的的强引用。 错误示例 下面是错误的,因为内部类隐式的含有父类的引用,这种情况下,通常是Activity和Fragment的引用。 class MyActivity extends Activity { private AsyncTask<Void, Void, Void> myTask = new AsyncTask<Void, Void, Void>() { // } } 这个问题的产生原因是因为AsyncTask的生命周期通常比Activity长,例如=当任务时候,一些配置改变了。 正确的使用AsyncTask方式 AsyncTask变为静
-
android中AsyncTask的学习笔记在android中实现异步任务机制的方式有两种:AsyncTask和Handler. 1>Handler Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,用于完成界面的更新. 使用的优点: 1)结构清晰,功能定义明确; 2)对于多个后台任务时,简单,清晰. 使用的缺点: 1)在处理单个后台任务时,代码过多,结构复杂(相对于AsyncTask), 2>AsyncTask AsyncTask是android提供的轻量级异步类.可以继承AsyncTask,在类中直接实现异步操作.并提供接口反馈当前异步操作的程度(可以通过接口
asynctask相关课程
asynctask相关教程
- 2.1 声明 AsyncTask 我们不能直接创建 AsyncTask,正确的方法是继承自 AsyncTask 实现一个它的子类,如下:private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { // 执行后台耗时任务 return; } protected void onProgressUpdate(Integer... progress) { // 任务执行进度更新 } protected void onPostExecute(Long result) { // 执行完毕,更新UI } }以上是 AsyncTask 的核心回调方法,每个方法的含义会在后面具体讲到。
- 1. AsyncTask 简介 AsyncTask 类通常用来在执行后台任务的同时刷新 UI,通过调用execute()方法触发后台任务的执行,首先会回调 AsyncTask 的onPreExecute(),接着回调doInBackground()来执行自定义的后台任务,最后回调onPostExecute()方法用来刷新 UI,整体流程示意图如下:
- 3 AsyncTask 关键回调方法 AsyncTask 是由 4 个回调方法配合组成,这 4 个回调方法按照一定的顺序依次被调用,所以我们需要 focus 的是在正确的回调方法中实现我们想要的逻辑,下面详细看看如何使用。onPreExecute():在执行execute()方法之后该方法立即被调用,标志着 AyncTask 正式开启。通常用来做一些需要在后台任务开启之前完成的初始化工作,比如展示一个进度条、或者弹出一个对话框等等。该方法在 UI 线程执行。doInBackground(Params):在执行完onPreExecute()方法之后立即被调用,用来执行需要放在后台执行的耗时任务。在创建 AsyncTask 的时候传入的参数就是提供给doInBackground使用的。在后台任务执行完毕后,还需要将执行结果返回到onPostExecutes ()中,同时我们也可以通过publishProgress(Progress…)方法来手动发布任务进度,进度将从子线程发送到 UI 线程。毋庸置疑,该方法在子线程中执行。onProgressUpdate(Progress…):当我们通过publishProgress(Params)发布进度之后,系统会回调该方法,用来获取任务执行进度并更新 UI。这一步就完成了子线程到主线程的通信,该方法在 UI 线程执行onPostExecute(Result):当后台任务执行完毕,该方法被回调,同时标志着整个 AyncTask 结束。与onPreExecute相反,通常会在onPostExecute中做一些回收工作,比如提示“下载完成”、“加载失败”、隐藏进度条等等。
- 5 小结 本节介绍了一个专门用于执行异步任务的工具类,首先需要创建一个子类继承自 AsyncTask,然后确定好需要传入和返回的参数类型,接着覆写 4 个关键的方法,剩下的线程切换及数据传输就交给系统完成了。相比 Handler,AsyncTask使用更简单,我们只需要关注我们的后台逻辑,而 Handler 需要我们自行管理的东西比较多。所以在执行后台任务刷新 UI 的场景,强烈推荐使用 AsyncTask,可以让我们的开发更加顺畅。
- 4.3 MainActivity编写 核心逻辑是在 HttpTask 里面,MainActivity 里面主要是设置触发按钮监听器,然后在点击事件中启动 HttpTask 即可:package com.emercy.myapplication;import android.app.Activity;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.start_http).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new HttpTask().execute(); } }); }}这里要记得,虽然在 HttpTask 中我们的代码是运行在doInBackground()方法中,但是启动 AsyncTask 的方法是调用eexecute()。编译运行界面如下:点击“发起 HTTP 请求”启动 AsyncTask 启动 http 连接,然后输入接收到的数据到 Logcat,过滤“HttpTask”字段,观察日志:以上是日志的片段,可以看到 Logcat 中的内容就是https://www.imooc.com/wiki/androidlesson页面的源代码,到此就获取成功了。
- 4.1 后台网络任务 首先开启一个 AsyncTask,在后台打开一个 HttpURLConnection,地址是https://www.imooc.com/wiki/androidlesson,接着设置相应参数,然后获取网络数据输入流,即可读到页面信息了。package com.emercy.myapplication;import android.os.AsyncTask;import android.util.Log;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class HttpTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { HttpURLConnection urlConnection = null; try { URL url = new URL("https://www.imooc.com/wiki/androidlesson"); urlConnection = (HttpURLConnection) url.openConnection(); int code = urlConnection.getResponseCode(); if (code != 200) { throw new IOException("Invalid response from server: " + code); } BufferedReader rd = new BufferedReader(new InputStreamReader( urlConnection.getInputStream())); String line; while ((line = rd.readLine()) != null) { Log.d("HttpTask", line); } } catch (Exception e) { e.printStackTrace(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } return null; }}
asynctask相关搜索
-
ajax
android
a href
abap
abap开发
abort
absolutelayout
abstractmethoderror
abstracttablemodel
accept
access
access教程
accordion
accumulate
acess
action
actionform
actionlistener
activity
addeventlistener