【Android】线程及异步操作

Android sdk 提供将某些操作从主UI线程分离开来的途径:

  • AsyncTask类,可完成异步操作并保持与主UI线程的通信
  • 标准Thread类完成异步操作
  • 在Activity或者Fragment中使用Loader完成数据载入,以保证运行速度

阻塞线程的操作将会产生ANR现象(application not responding)

常见阻塞线程的操作包括:

  • 所有过长或负责的计算或操作
  • 请求获取长度不定的数据集
  • 解析数据集
  • 处理多媒体文件,例如图像、视频或音频
  • 对长度不定的数据结构进行迭代
  • 获取网络资源
  • 获取地理位置服务
  • 获取内容提供器接口
  • 接入本地数据库
  • 接入本地文件
  • 接入任务包含以上内容的服务

AsyncTask回调方法:

onPreExecute()在后台操作完成前运行在UI线程上;

doInBackground()运行在后台并处理后台操作;

从doInBackground()中调用publishProcess()方法周期性地通知UI线程有关后台操作的进度。该方法向UI操作发送消息,并借此机会更新用户可见的进度条。onProcessUpdate()在UI线程中运行;

后台操作完毕,onPostExecute()在UI线程运行;

运行execute(),AsyncTask以后台方式处理操作,不会影响UI线程;

AsyncTask任务启动方法:

  • execute()方法,每个任务实例都被执行一次,像是使用线程池;
  • executeOnExector(AsyncTask.THREAD_POOL_EXECUTOR,ID);按照ID执行任务
时间: 2024-11-07 21:52:21

【Android】线程及异步操作的相关文章

Android项目----AsyncTask异步操作

public abstract class AsyncTask extends Object java.lang.Object    ? android.os.AsyncTask<Params, Progress, Result> Class Overview AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish

Android 线程更新UI报错 : Can&#39;t create handler inside thread that has not called Looper.prepare()

MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toString(); String timelength = lengthText.getText().toString(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new NewsService(getApp

Android 线程 Looper.prepare()、Looper.loop() 使用

优化项目过程中发现了一个很Low的问题,整理一下,备忘: 说问题之前先看下HandlerThread的定义 一个封装了looper的线程: Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息. 注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.get

android 线程间同步问题

我现在有2个android线程,一个是view 线程,一个是工作线程,我现在想让 工程线程暂停,直到view线程的 onDraw方法被调用后再继续运行 如何做?如何等待信号 处理方法 在java2个线程中传递对象,让一个线程去通知另一个线程的方式如下,在工作线程中调用 stick.wait(); When the view thread finishes its onDraw work, it calls this: 当view线程调用完onDraw的时候可以调用 stick.notify();

Java(Android)线程池 总结

一种是使用Executors工厂生产线程池:另一种是直接使用ThreadPoolExecutor自定义. Executors工厂生产线程池 Java(Android)线程池 Trinea 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new Thread吗? Java 1 2 3 4 5 6 7 newThread(newRunnable(){ @Ove

android线程间通讯

近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念.我们的主线程(UI线程)就是一个消息循环的线程.针对这种消息循

android线程学习心得

有一篇关于android线程讲的非常好,大家可以参考下,其中有一句话讲的非常好,就拿来做开篇之句: 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理,所以主线程通常又被叫做UI线程.在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. 咱新手在第一次接

Java(Android)线程池---基础篇

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 newThread(newRunnable(){ 2 3 @Override 4 publicvoidrun(){ 5 // TODO Auto-generated method stub 6 } 7 }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致

优化 Android 线程和后台任务开发

在 Android 开发中,你不应该做任何阻碍主线程的事情.但这究竟意味着什么呢?在这次海湾 Android 开发者大会讲座中,Ari Lacenski 认为对于长时间运行或潜在的复杂任务要特别小心.这一次演讲,我们将根据一个真实场景应用的需求,讨论 AsyncTask, Activity, 和 Service,逐步建立一个更易于维护的解决方案. Android 线程 (0:46) 当我们谈论线程,我们知道一个 Android 应用程序至少有一个主线程.这个线程是随着你的Application 

android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)

按照下面的理解就是handler与ui线程有一定的关联可以因为更新界面只能在主线程中所有更新界面的地方可以在接受消息的handleMessage那里还有更新界面可以在handler.port(new Runnable))在自定义的线程中然后执行post方法通知主线程去更新这个界面 下面是参考: Android 线程是单线程的. 所以更新UI要用到Handler: private Handler splashHandler = new Handler() {public void handleMe