1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现...此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。...AsyncTask中的第一个参数 * 这里的String返回值对应AsyncTask的第三个参数 * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改...参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值) * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置...() { textView.setText("开始执行异步线程"); } /** * 这里的Intege参数对应AsyncTask中的第二个参数
作用 实现多线程 在工作线程中执行任务,如 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作 从而保证线程安全...Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数 // b. Progress:异步任务执行过程中,返回下载进度值的类型 // c....执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()...使用时的注意点 在使用AsyncTask时有一些问题需要注意的: 7.1 关于 生命周期 结论 AsyncTask不与任何组件绑定生命周期 使用建议 在Activity 或 Fragment中使用...引用已无效,故复写的onPostExecute()将不生效,即无法更新UI操作 使用建议 在Activity恢复时的对应方法 重启 任务线程 8.
原文 https://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask。...5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。...在使用的时候,有几点需要格外注意: 1.异步任务的实例必须在UI线程中创建。 2.execute(Params... params)方法必须在UI线程中调用。...下面是mWorker和mFuture实例在AsyncTask中的体现: private final WorkerRunnable mWorker; private final...) { //call方法被调用后,将设置优先级为后台级别,然后调用AsyncTask的doInBackground方法 public Result call() throws
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。...5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。...在使用的时候,有几点需要格外注意: 1.异步任务的实例必须在UI线程中创建。 2.execute(Params... params)方法必须在UI线程中调用。...下面是mWorker和mFuture实例在AsyncTask中的体现: private final WorkerRunnable mWorker; private...Params, Result>() { //call方法被调用后,将设置优先级为后台级别,然后调用AsyncTask的doInBackground方法 public Result call
作用 实现多线程 在工作线程中执行任务,如 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作...Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数 // b. Progress:异步任务执行过程中,返回下载进度值的类型 // c....执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()...使用时的注意点 在使用AsyncTask时有一些问题需要注意的: 7.1 关于 生命周期 结论 AsyncTask不与任何组件绑定生命周期 使用建议 在Activity 或 Fragment中使用...引用已无效,故复写的onPostExecute()将不生效,即无法更新UI操作 使用建议 在Activity恢复时的对应方法 重启 任务线程 ---- 8.
UI操作(这个方法是在子线程中执行的),我们可以调用publishProgress(Intger…)方法来调用专门的UI更新方法来进行UI的更新。...这个方法的返回值会传递给onPostExecute方法用于收尾 onProgressUpdate(Interge…) : 这个方法里进行UI的更新,当在doInBackground方法中调用了publishProgress...用于进度的UI更新),第三个参数的参数类型为onPostExecute方法的参数类型,并且也是doInBackground方法返回值类型(这里传入Boolean用于判断执行的结果),当然,我们可以根据自己的需要来传入对应的参数类型...接下来仍然以上面那个例子,我们用AsyncTask来实现它: 在原来的工程基础上新建一个类MyAsyncTask.java: import android.content.Context; import...并且LogCat 中打印的信息中我们可以发现 MyAsyncTask 和 MainActivity 确实不是在同一个线程之中(MyAsyncTask 的 doInBackground 方法在子线程中执行
此外,我们也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程中。...,最后分发回Handler的handleMessage(Message msg)方法中,由于Handler对象是在主程序中创建的,所以,此时handleMessage(Message msg)方法中的代码也是在主程序中运行... 为了更加方百年我们在子线程中对UI进行操作,Android还提供了另外一些好用的工具,AsyncTask就是其中之一。...onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。 ...() { 6 //call方法被调用后,将设置优先级为后台级别,然后调用AsyncTask的doInBackground方法 7
内存泄漏 什么是内存泄漏 内存泄漏(Memory Leak):是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。...解决方案: 在Activity销毁时候也应该取消相应的任务AsyncTask.cancel()方法,避免任务在后台执行浪费资源,进而避免内存泄漏的发生 private void destroyAsyncTask...动画资源未释放导致内存泄漏 比如: public class LeakActivity extends AppCompatActivity { private TextView textView... objectAnimator.start(); } } 解决方案: 在属性动画中有一类无限循环动画,如果在Activity中播放这类动画并且在onDestroy中去停止动画,...查了很多资料,发现这是 Android SDK中输入法的一个Bug,在15中都存在,目前Google还没有解决这个Bug。
} } } 进入某个Activity,Activity中需要的数据来自于网络或者其它耗时操作,可以在AsyncTask中onPreExecute完成一些准备操作。...比如上例中显示进度对话框;然后在doInBackground完成耗时操作, 在进行耗时操作时还能不时的通过publishProgress给onProgressUpdate中传递参数,然后在onProgressUpdate...比如上例更新进度条的进度;当耗时任务执行完成后,最后在onPostExecute进行设置控件数据更新UI等操作,例如隐藏进度对话框。...mStatus = Status.RUNNING;设置当前AsyncTask的状态为RUNNING,上面的switch也可以看出,每个异步任务在完成前只能执行一次。...onPostExecute(result); 主要这里的调用是在handler的handleMessage中,所以是在UI线程中。
在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 1....比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText...(d)onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread...为了正确的使用AsyncTask类,以下是几条必须遵守的准则: 1) Task的实例必须在UI thread中创建 2) execute方法必须在UI thread中调用 3) 不要手动的调用onPreExecute...,否则多次调用时将会出现异常 AsyncTask示例: 从网上获取一个网页,在一个TextView中将其源代码显示出来 /** * * @author yanggang * @see http
1 ) AsyncTask实现的原理 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作 使用的优点:简单,快捷,过程可控 使用的缺点:...在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理 在Handler 异步实现时,主要是主线程启动Thread(子线程)并生成Message,传递给Handler...使用的优点:结构清晰,功能定义明确;对于多个后台任务时,简单,清晰 使用的缺点:在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) 使用AsyncTask类最少要重写以下这两个方法:doInBackground...publishProgress(Progress...)方法后,这个方法就会很快被调用, * 方法中携带的参数就是在后台任务中传递过来的。...在这个方法中可以对UI 进行操作, * 利用参数中的数值就可以对界面元素进行相应地更新。
(Boolean aBoolean) { super.onPostExecute(aBoolean); textView.setText("onPostExcute...在AsyncTask构造方法里面,发现了这两个对象的初始化相关: public AsyncTask(@Nullable Looper callbackLooper) { mHandler...Process.setThreadPriority设置了线程优先级,这里任务在后台执行,所以优先级设置成THREAD_PRIORITY_BACKGROUND。...关于Binder.flushPendingCommands(),官方释义:将当前线程中挂起的任何绑定命令刷新到内核驱动程序中。...很显然这里的逻辑都是在UI线程发生。
Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了。...在 Linux 中,一个用户ID 识别一个给定用户;在 Android 上,一个用户ID 识别一个应用程序。应用程序在安装时被分配用户 ID,应用程序在设备上的存续期间内,用户ID 保持不变。...如下图,显示了两个 Android 应用程序,运行在同一进程上。 ? 不同的应用程序可以运行在相同的进程中。...其中我们可以看到在“Android本地库 & Java运行环境层”中,Android 运行时中, Dalvik是Android中的java虚拟机,可支持同时运行多个虚拟机实例;每个Android应用程序都在自己的进程中运行...4) onPostExecute(Result),在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread
AsyncTask异步任务 Thread+Handler方式虽然能够实现多线程的通信处理,但是写起代码来颇为繁琐,所以Android提供了AsyncTask这样一个轻量级的异步任务类,其内部封装好...AsyncTask是个模板类(AsyncTask),继承它的新类需要指定模板的参数类型,模板参数说明如下: Params : 任务启动时的输入参数,...可设置为String类型或者自定义的数据结构 下面是要重写的方法,不能直接调用: doInBackground : 异步处理操作都放在该方法中,params参数对应execute方法的输入参数。...方法中调用publishProgress时会触发该方法,通常用于处理过程中刷新进度条 onPostExecute : 在doInBackground执行完毕时调用,通常用于处理完毕后刷新展示页面 onCancelled...注意,只有水平进度条才能设置当前进度,圆圈进度无法设置当前进度 样式设置方式为,在xml布局文件的ProgressBar增加如下的style属性: style="?
public class HttpJsonActivity extends AppCompatActivity { private Spinner channel; private TextView...super.onCreate(savedInstanceState); setContentView(R.layout.activity_http_json); tv = (TextView...> parent) { } }); } //获取频道 public class GetChannel extends AsyncTask<...state.equals(Environment.MEDIA_MOUNTED)){ return "SD卡未就绪"; } File root =.../showapi_open_bus/channel_news/channel_news"; /*获取 频道对应新闻的网络接口 get 请求参数: * channelId
作为开发人员,在我们的日常开发中,为了构建更好的应用程序,我们需要考虑很多事情以保证应用运行在正轨上,其中之一是要确保我们的应用程序不会崩溃。应用崩溃的一个常见原因是内存泄漏。...为了帮助他人在代码分析上减少花费时间,我将介绍内存泄漏的几个例子,阐述在Android Studio中如何检查它们,当然最重要的是如何将其解决。...我们所需要做的就是获取系统服务本身和设置一个回调来接收更新。在这里,我们在Activity中实现了位置监听接口,这意味着LocationManager将持有该Activity的引用。...回到我们的代码,我们可以看到,这个引用是由于我们在requestLocationsUpdates方法中设置Activity作为位置更新回调导致的。...= null) { view.setText(result); } } } } 请注意,在onPostExecute我们要检查空值
标题图 AsyncTask 了解AsyncTask异步,需要了解一下异步任务(多线程),什么是线程,可以这么说线程好比边吃饭边看电视,AsyncTask是为了方便后台线程中操作更新UI,本质为Handler...学习AsyncTask需要知道它的参数,它要实现的方法onPreExcecute(),onPostExecute(),后台线程操作doInBackground...(Boolean aBoolean){ super.onPostExecute(aBoolean); //执行完,执行结果 处理 } //当我们的进度在变化的时候 @Override protected...(Boolean aBoolean) { super.onPostExecute(aBoolean); //也是在主线程中,执行结果 处理 //处理UI } 最后进度变化 //当我们的进度在变化的时候...开发中常用到的一个控件,用来展示数据,我们在微信列表项,文章列表随处可见。
AsyncTask在网络通讯中用到的特别多,一般我们都新建一个类专门处理这块的,但是在异步处理完后可能需要主线程中同步一些显示,所以就用到了回调函数,今天我们也主要讲的是回调函数。...视频效果 代码演示 我们用Android Studio新建一个AsyncCallBack的项目,我们建一个输入数字计算它的N次方得到的结果,在计算的过程中用AsyncTask进行处理,得到的结果通过回调函数在主界面...然后再做AsyncTask的异步计算,这里面我们加了一个ProgressDialog,用于在计算过程中显示 CalcNum类 package dem.vac.asynccallback; import...); // 设置采用进度条模糊模式 dialog.setIndeterminate(false); // 这里必须先设置好的直接显示,能显示出来的更改才有效...然后在btn的按钮事件中调用我们的AsyncTask的方法 ? 最后要现callback的实现方法 ?
---- Android3.0以及以后的版本中,禁止在主线程执行网络请求,否则会抛出异常,可见在UI线程中执行耗时操作是不推荐的行为。所以,在进行与耗时操作同步进行的操作时(即并行)使用多线程。...Progress:后台任务完成的进度值的类型。 Result:后台执行任务完成后返回结果的类型。 使用AsyncTask的步骤: 创建AsyncTask的子类,并为三个泛型参数指定类型。...onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法...正在下载,请稍等..."); //设置对话框的取消按钮 progressDialog.setCancelable(true); //设置进度条的最大值...方法中执行更新进度,在onPostExecute()方法中销毁进度条对话框,并弹出Toast提示下载完成。
领取专属 10元无门槛券
手把手带您无忧上云