asynctask

Asynctask解析以及注意事项

柔情痞子 提交于 2019-12-04 08:37:13
说到AsyncTask这个类,好多人其实不太了解。最近看了下代码,把心得分享给大家。 AsyncTask的execute的执行流程为 先调用ThreadPoolExecutor.execute(mFuture); 然后ThreadPoolExecutor.execute(mFuture) 会调用ThreadPoolExecutor.addWorker(mFuture); 最后ThreadPoolExecutor.addWorker(mFuture)会调用mFuture的run()方法,run方法中就是该线程要执行操作的地方 到此我们来关注一下mFuture,AsyncTask中的mFuture是一个FutureTask,FutureTask实现了Future<V>, Runnable两个接口, Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果,计算完成后只能使用 get 方法来获取结果。 mFuture以mWorker作为参数 现看mFuture的构造方法: public void run() { sync.innerRun(); } sync是什么呢?Sync类是一个内部类,我们看看它的初始化 public FutureTask(Callable<V> callable) { if (callable == null)

AsyncTask的使用注意事项

对着背影说爱祢 提交于 2019-12-04 08:37:00
AsyncTask的使用注意事项 前面的文章曾建议使用AsyncTask而不是使用Thread,但是AsyncTask似乎又有它的限制,这就要根据具体的需求情况而选择合适的工具,No Silver Bullet。 下面是一些建议: •改善你的设计,少用异步处理 线程的开销是非常大的,同时异步处理也容易出错,难调试,难维护,所以改善你的设计,尽可能的少用异步。对于一般性的数据库查询,少量的I/O操作是没有必要启动线程的。 •与主线程有交互时用AsyncTask,否则就用Thread AsyncTask被设计出来的目的就是为了满足Android的特殊需求:非主线程不能操作(UI)组件,所以AsyncTask扩展Thread增强了与主线程的交互的能力。如果你的应用没有与主线程交互,那么就直接使用Thread就好了。 •当有需要大量线程执行任务时,一定要创建线程池 线程的开销是非常大的,特别是创建一个新线程,否则就不必设计线程池之类的工具了。当需要大量线程执行任务时,一定要创建线程池,无论是使用AsyncTask还是Thread,因为使用AsyncTask它内部的线程池有数量限制,可能无法满足需求;使用Thread更是要线程池来管理,避免虚拟机创建大量的线程。比如从网络上批量下载图片,你不想一个一个的下,或者5个5个的下载,那么就创建一个CorePoolSize为10或者20的线程池

android AsyncTask介绍

南楼画角 提交于 2019-12-04 08:36:33
AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作, 并 提供接口反馈当前 异步执行的程度 (可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点 : l 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。 使用的优点: l 结构清晰,功能定义明确 l 对于多个后台任务时,简单,清晰 使用的缺点: l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) AsyncTask介绍 Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程)

Android Studio 之 ROM【2】, LiveData+ViewModel+AsyncTask+Repository

試著忘記壹切 提交于 2019-12-03 21:05:34
改造上一节 ROM【1】, 1.利用 LiveData<List<Word>> 与 observe 中的 onChanged 配合,删除掉之前的textView更新函数(updateTextView) 引入 LiveData 与 observe ,只要数据发生改变,就会自动更新内容。 MainActity类中的代码: LiveData<List<Word>> allWordsLive; allWordsLive = wordDao.getAllWordLive(); //利用 LiveData<> 与 observe的onChanged配合,数据自动刷新 allWordsLive.observe(this, new Observer<List<Word>>() { @Override public void onChanged(List<Word> words) { //当数据改变时会自动呼叫这个函数 //String text=""; StringBuilder text = new StringBuilder(); textView.setText(text); //先将 textView 清空 for(int i=0;i<words.size();i++){ Word word = words.get(i); text.append(word.getId() + ":" +

详解Android中AsyncTask的使用

有些话、适合烂在心里 提交于 2019-12-03 19:39:19
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。 关于Handler的相关知识 ,前面也有所介绍,不清楚的朋友们可以参照一下。 为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。 先来看看AsyncTask的定义: [java] view plain copy public abstract class AsyncTask<Params, Progress, Result> { 三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。 一个异步任务的执行一般包括以下几个步骤: 1. execute(Params... params) ,执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。 2. onPreExecute()

Android 多线程和线程池详解

孤人 提交于 2019-12-03 16:45:39
AsyncTask 使用 AsyncTask 需要继承 AsyncTask,重写 doInBackground 方法。 onPreExecute 运行在调度线程 doInBackground 运行在线程池中 onPostExecute / onProgressUpdate / onCancelled 运行在 UI 线程中。 原理 AsyncTask 内部有两个静态线程池 一个线程池 SERIAL_EXECUTOR 表示串行线程池,内部包含一个消息队列,用来保存任务、按顺序调度任务 一个 THREAD_POOL_EXECUTOR 用来执行任务,其线程数量是根据 CPU 核数计算的 一个跑在主线程的 Handler,把执行进度和执行结果的回调发送到主线程 这两个线程池和一个 Handler 都是静态的,实际上是所有的 AsyncTask 对象公用的 特点和缺陷 4.1之前版本需要在主线程完成初始化,现在的版本不需要初始化了 5.0以及之前 AsyncTask 对象必须在主线程创建,execute 方法必须在主线程调用,之后的版本无此限制,但是 onPreExecute 方法会在调度线程执行 一个 AsyncTask 只能执行一次,否则会报错 1.6之前是串行任务,1.6开始采用线程池处理任务,3.0开始又串行任务,但可以使用 executeOnExecutor 并行 一般会把

FATAL EXCEPTION : AsyncTask#5

匿名 (未验证) 提交于 2019-12-03 10:24:21
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: They have mentionned that the ERROR was occured while excecuting doInBackground() public class NewClientActivity extends Activity { // Progress Dialog private ProgressDialog pDialog; JSONParser jsonParser = new JSONParser(); EditText name; EditText login; EditText password; EditText rePassword; EditText email; EditText adresse; EditText tel; // url to create new product private static String url_add_client = "http://192.168.1.3/android_connect/add_client.php"; // JSON Node names private static final String TAG_SUCCESS = "success"; @Override

throwing java.lang.UnsupportedOperationException on some devices

匿名 (未验证) 提交于 2019-12-03 10:10:24
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: I've found out, that my app, that uses the yandex map kit, on some devices crashes with such an exception. What does this "java.lang.UnsupportedOperationException" exception means??? 06-26 16:25:06.301: ERROR DeviceIdProvider(3174): UNKNOWN ID QUERY content://ru.yandex.device.id.maps/device_id id -1 06-26 16:25:06.301: ERROR/DatabaseUtils(3174): Writing exception to parcel java.lang.UnsupportedOperationException: query: Not supported yet - content://ru.yandex.device.id.maps/device_id at ru.yandex.core.device.id.DeviceIdProvider.query

Libgdx学习笔记:分享自己写的异步加载

。_饼干妹妹 提交于 2019-12-03 09:37:17
从需求说起: 解析xml,json文件等耗时的操作,如果放到绘制线程,或者初始化里面,会导致画面卡顿一下,让人看起来不爽,这时候就想能不能异步加载一下。 查看Libgdx的AssetManager发现里面用到了AsyncExecutor,AsyncTask,AsyncResult相关异步线程池。 简单介绍下: 【AsyncExecutor】 在一个独立的线程里面,异步执行 AsyncTask实例。不需要使用的时候,调用dispose()进行释放。 看内部源码,实际使用了java的线程池Executors.newFixedThreadPool来管理的。 简单说是处理 AsyncTask的容器。 【 AsyncTask 】为接口,可根据实际情况实现成自己的Task。 提交任务给一个AsyncExecutor,返回类型为T的结果。 【AsyncResult】 AsyncExecutor.submit(AsyncTask)返回的结果。 isDone()方法,代表任务是否处理完毕。 ================================================================= 上代码: CHAsyncTask 抽象任务类 CHAsyncManager异步管理中心,最好放在Game里面初始化一次,并且在render()中调用update()方法。

How to test AsyncTask triggered by a click?

匿名 (未验证) 提交于 2019-12-03 09:18:39
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: If the AsyncTask is triggered by a click event on a button, how can I test it - how can I wait until the AsyncTask completes? Note I can always execute the AsyncTask directly in my test method, I know how to test such scenario. However, if I insist on on using simulating the onClick event using performClick() can I still test my registration process? MainActivityFunctionalTest public class MainActivityFunctionalTest extends ActivityInstrumentationTestCase2<MainActivity> { // ... public void testRegistration() { ImageButton submitBtn =