asynctask

Android访问网络的常用方式:Handler、AsyncTask简单例子(服务器端+Android端)

匿名 (未验证) 提交于 2019-12-03 00:43:02
首先应该明白两点: 1.Android不允许在主线程(对于android来说,主线程就是UI线程)中访问网络。 2.Android不允许在一个子线程中直接去更新主线程中的UI控件。 对于问题1,可能你会说,这还不好办吗?再开一个线程不就完了?是的,你很聪明,原理也很简单。 对于问题2,就需要用到线程间通信(IPC),Android很好的将其进行了封装,也就有了今天的Handler和AsyncTask。 适用情况: AsyncTask是一个轻量级的后台异步任务类,简单、便捷。适合后台任务不太多的情况,因为每一个后台任务都要写成一个Class去继承AsyncTask,代码显得比较臃肿。否则就使用Handler吧,很强大,但对于新手来说较难掌握 使用方法: AsyncTask定义了三种泛型类型 Params,Progress和Result 。 Params 启动任务执行的输入参数,比如HTTP请求的URL。 Progress 后台任务执行的百分比。 Result 后台执行任务最终返回的结果,比如String。 最少要重写以下方法: doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…

AsyncTask

匿名 (未验证) 提交于 2019-12-03 00:25:02
AsyncTask是什么 AsyncTask怎么用 需要实现的几个方法分别是什么 什么是泛型参数 什么是长度可变参数列表 案例解析――倒计时Demo 什么是AsyncTask 1.AsyncTask是Android提供的轻量级(实现代码量少)的异步类 2.为了降低异步通信的开发难度,提供了AsyncTask。 3.AsyncTask直接继承Object类,位于android.os包中。 4.使用AsyncTask可以忽略Looper、MessageQueue、Handler等复杂对象,更便捷的完成异步耗时的操作。 AsyncTask怎么用 1.新建内部类继承AsyncTask; 2.定义AsyncTask的三种泛型参数; 3.重写DoInBackground抽象方法; 4.重写onPreExecute方法; 5.重写onProgressUpdate方法; 6.重写onPostExecute方法; 7.需要调用的地方启用execute方法 AsyncTask的泛型参数和常用方法 AsyncTask三种泛型参数 Params:启动任务执行的输入参数 Progress:后台任务执行的百分比 Result:后台执行任务最终返回的结果 onPreExecute方法 1.异步任务开始执行时,系统最先调用此方法。 2.此方法运行在主线程中,可以对控件进行初始化等操作。

第11章 Android的线程和线程池

匿名 (未验证) 提交于 2019-12-02 23:55:01
除了Thread以外,在Android中可以扮演线程的角色还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程。 AsyncTask封装了线程池和Handler。HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。IntentService是一个服务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。IntentService是一种服务,不容易被系统杀死从而可以尽量保证任务的执行,如果是一个后台线程,由于这个时候进程中没有活动的四大组件,那么这个进程的优先级就会降低,容易被系统杀死,这就是IntentService的优点。 从Android3.0开始系统要求网络访问必须在子线程执行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常。 11.2.1 AsyncTask AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 4个核心方法: onPreExecute() doInBackground(Params… params)在此方法中可以通过publishProgress方法来更新任务进度

「阿里Android面试解析」20道面试帮助灵魂拷问,带你征服面试官

你说的曾经没有我的故事 提交于 2019-12-02 16:03:56
大家好!今天给小伙伴分享20道BAT等大厂Android岗面试都会问的问题,对于这20题还整理了一些视频讲解分析+ 完整的Android知识体系PDF ,在文末有免费获取!有不对的地方也可以在评论区留言探讨,也可以转发关注下我以后会长期分享! (更多完整项目下载。未完待续。源码。图文知识后续上传github。) 完整PDF可以点击 关于我 联系我获取 Android 面试帮助篇 1 、要做一个尽可能流畅的 ListView ,你平时在工作中如何进行优化 的? ①Item 布局, , 层级越少越好, , 使用 hierarchyview ** ②复用 convertView ③使用 ViewHolder ④item 中有图片时,异步加载 ⑤快速滑动时,不加载图片 ⑥item 中有图片时,应对图片进行适当压缩 ⑦实现数据的分页加载 2 、对于 Android 的安全问题,你知道多少 ①错误导出组件 ② 参数校验不严 ③WebView 引入各种安全问题,webview 中的 js 注入 ④不混淆、不防二次打包 ⑤明文存储关键信息 ⑦ 错误使用 HTTPS ⑧山寨加密方法 ⑨滥用权限、内存泄露、使用 debug 签名 3 、如何缩减 APK 包大小? 代码 保持良好的编程习惯,不要重复或者不用的代码,谨慎添加 libs,移除使用不到 的 libs。 使用 proguard 混淆代码

Android 多线AsyncTask详解

…衆ロ難τιáo~ 提交于 2019-12-02 15:36:12
Android 多线AsyncTask详解 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: 609025984@qq.com 如果需要转载,请注明出处,谢谢!! 本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。 一、Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新 的线程来执行。默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程。当我们 通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然,我们可以自己来管理我们的Android应用的线程,我们可以根据 我们自己的需要来给应用程序创建额外的线程。 二、Main Thread 和 Worker Thread 在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。

Android多线程任务优化1:探讨AsyncTask的缺陷

懵懂的女人 提交于 2019-12-01 21:58:04
导语 :在开发Android应用的过程中,我们需要时刻注意保障应用的稳定性和界面响应性,因为不稳定或者响应速度慢的应用将会给用户带来非常差的交互体验。在越来越讲究用户体验的大环境下,用户也许会因为应用的一次Force Close(简称FC)或者延迟严重的动画效果而卸载你的应用。由于现在的应用大多需要异步连接网络,本系列文章就以构建网络应用为例,从稳定性和响应性两个角度分析多线程网络任务的性能优化方法。 概述 :为了不阻塞UI线程(亦称主线程),提高应用的响应性,我们经常会使用新开线程的方式,异步处理那些导致阻塞的任务(如要了解Android异步处理的实现方式和原理,请先阅读 《Android异步处理系列文章索引》 )。 AsyncTask是Android为我们提供的方便编写异步任务的工具类,但是,在了解AsyncTask的实现原理之后,发现AsyncTask并不能满足我们所有的需求,使用不当还有可能导致应用FC。 本文主要通过分析AsyncTask提交任务的策略和一个具体的例子,说明AsyncTask的不足之处,至于解决办法,我们将在下篇再讲解。 分析 : AsyncTask类包含一个全局静态的线程池,线程池的配置参数如下: private static final int CORE_POOL_SIZE =5;//5个核心工作线程 private static final int

Android AsyncTask

会有一股神秘感。 提交于 2019-12-01 21:57:50
简介: AsyncTask是android提供的轻量级的异步类。比Handler更轻量级一些,适用于简单的异步处理。 AsyncTask内部封装了Thread和Handler,简化Thread+Handler,可以让我们在后台进行计算并且把计算的结果及时更新到UI上。 AsyncTask并不是像多个线程那样完全并行执行的。 优缺点: 优点: 简单,快捷 过程可控 结构清晰,功能定义明确 对于多个后台任务时,简单,清晰 缺点: 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果此时向线程提交任务,将会抛出RejectedExecutionException。 解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。 构造方法: AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。 AsyncTask定义了三种泛型类型 Params,Progress和Result。 Params

高效使用Bitmaps(二) 后台加载Bitmap

徘徊边缘 提交于 2019-12-01 19:47:22
为什么要在后台加载Bitmap? 有没有过这种体验:你在Android手机上打开了一个带有含图片的ListView的页面,用手猛地一划,就见那ListView嘎嘎地卡,仿佛每一个新的Item都是顶着阻力蹦出来的一样?看完这篇文章,你将学会怎样避免这种情况的发生。 在Android中,使用BitmapFactory.decodeResource(), BitmapFactory.decodeStream() 等方法可以把图片加载到Bitmap中。但由于这些方法是耗时的,所以多数情况下,这些方法应该放在非UI线程中,否则将有可能导致界面的卡顿,甚至是触发ANR。 一般情况下,网络图片的加载必须放在后台线程中;而本地图片就可以根据实际情况自行决定了,如果图片不多不大的话,也可以在UI线程中操作来图个方便。至于谷歌官方的说法,是只要是从硬盘或者从网络加载Bitmap,统统不应该在主线程中进行。 基础操作:使用AsyncTask class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; private int data = 0; public BitmapWorkerTask(ImageView

解决AsyncTask引发的RejectedExecutionException

别来无恙 提交于 2019-11-30 18:11:34
AsyncTask 是google为易用和有效的异步操作UI线程的所开发的一个封装类。使用者可以很轻易的使用其进行后台操作,然后将结果传给UI线程,而不需要使用Thread和Handler。 这样好用的一个类,显然可以在ListView异步加载图片时大显身手,本着这样的想法,笔者瞬间就完成了一段这样的模拟代码: Adapter的getView方法: 1 @Override 2 public View getView(int pos, View view, ViewGroup viewGroup) { 3 if (view == null) { 4 view = getLayoutInflater().inflate(R.layout.test2_list_item, 5 null); 6 } 7 ImageView imageView = (ImageView) view.findViewById(R.id.imageView); 8 //这里每次都new出一个新的AsyncTask,进行执行。 9 new TestAsyncTask(imageView, pos).execute(new Object()); 10 TextView itemView = (TextView) view.findViewById(R.id.itemView); 11 itemView

解决AsyncTask引发的RejectedExecutionException

↘锁芯ラ 提交于 2019-11-30 18:11:21
AsyncTask 是google为易用和有效的异步操作UI线程的所开发的一个封装类。使用者可以很轻易的使用其进行后台操作,然后将结果传给UI线程,而不需要使用Thread和Handler。 这样好用的一个类,显然可以在ListView异步加载图片时大显身手,本着这样的想法,笔者瞬间就完成了一段这样的模拟代码: Adapter的getView方法: 1 @Override 2 public View getView(int pos, View view, ViewGroup viewGroup) { 3 if (view == null) { 4 view = getLayoutInflater().inflate(R.layout.test2_list_item, 5 null); 6 } 7 ImageView imageView = (ImageView) view.findViewById(R.id.imageView); 8 //这里每次都new出一个新的AsyncTask,进行执行。 9 new TestAsyncTask(imageView, pos).execute(new Object());10 TextView itemView = (TextView) view.findViewById(R.id.itemView);11 itemView.setText(