以前诺基亚手机是怎样处理异步消息处理机制任务的

Android相关(5)
Android上面的很多操作是不能直接放在ui线程上面的。当ui线程被阻塞5秒以上的时候应用会出现未响应的对话框过。当此现象出现的时候会直接影响用户的用户体验的。所以我们需要通过方法对异步任务或者操作进行相关的处理。在这里罗列出集中相关的处理方法:
首先我们最先想到的应该是使用Thread+Handler实现非UI线程更新UI界面,即在线程执行的时候通过发送message来通过Handler来处理和更新ui。 另外一种方法就是通过异步任务:AsyncTask来进行数据的处理,通过继承AsyncTask并重写相关的方法,比较重要的是就是doBackGround和onPostExecutor的重写。一个负责处理事务,一个负责更新界面。
基本上我们最开始想到的就是上面说的是这两个方法,其实还有两个方法,一个是通过service,另外一个就是通过IntentService来进行处理。总结一点就是:android上面处理事务的方法主要是一下四种:Handler+Thread,AsyncTask,Service,IntentService。其中每个方法都有各自的适用的地方。Service是在主线程上面进行处理的,而InentService是启动了一个单独的线程进行处理的,这一点在二者的源码中可以清楚的了解到。虽然IntentService是继承Service的,但是Service适合全局性质的服务,比如去启动一些音乐服务,或者启动获取天气的服务等等,而IntentService更加适合去执行一系列的操作,这些操作的要求就是尽量按照一定的顺序进行相关的处理,才能保证最后的结果的正确性,一般应用IntentService的地方在基本上和多线程这方面有关系,通过IntentService的序列化处理来避免出现多线程操作相同的资源而出现的问题。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80949次
排名:千里之外
原创:24篇
(2)(4)(2)(1)(1)(1)(1)(2)(1)(1)(1)(3)(4)(1)(7)android怎样实现异步任务停止_百度知道Android应用开发(33)
主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件等,对于其他的操作尽量不要在UI线程中实现,因为这些操作很有可能会阻塞UI线程,比如一些耗时操作,会导致UI界面停止响应,从而降低了用户的体验。所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在TextView中将其源代码显示出来,此时就应该将连接网络,获取网络数据的操作(耗时)放在新线程中完成。
由于新线程不允许直接更新UI组件,我们该如何更新UI组件数据呢?为了解决新线程不能更新UI组件问题,Android提供了如下几种解决方案:
,提供了简易的编程方式使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI。不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。
:该方法将在执行实际的后台操作前被UI线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
:将在onPreExecute
方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些比较耗时的后台处理工作。可以调用 publishProgress()方法来实时更新任务进度。该方法是抽象方法,子类必须实现。
:在publishProgress方法被调用后,UI
线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
:在doInBackground
执行完成后,onPostExecute 方法将被UI线程调用,后台的计算结果(doInBackground方法返回值)将通过该方法传递到UI线程,并且在界面上展示给用户。
:在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
UI线程中创建;
UI线程中调用;
不要手动的调用onPreExecute(),
onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用;
出现异常。
package com.example.android_
import android.app.A
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.ProgressB
import android.widget.TextV
public class MainActivity extends Activity {
private TextView textV
private ProgressBar progressB
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
downbtn = (Button)findViewById(R.id.download);
textView = (TextView)findViewById(R.id.text);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
final DownloadTest download = new DownloadTest(textView,progressBar); //获取一个DownloadTest对象,并传递组件对象参数
downbtn.setOnClickListener(new OnClickListener()
public void onClick(View v) {
download.execute(200);
package com.example.android_
import android.graphics.C
import android.os.AsyncT
import android.view.V
import android.widget.ProgressB
import android.widget.TextV
public class DownloadTest extends AsyncTask&Integer,Integer,String&
private TextV
private ProgressB
//带参数构造方法
DownloadTest(TextView text,ProgressBar bar)
//不带参数构造方法
DownloadTest()
/*1.onPreExecute方法
* 为子线程(后台)运行初始化相关内容
protected void onPreExecute() {
tv.setVisibility(View.VISIBLE);
//设置显示文本组件
pb.setVisibility(View.VISIBLE);
//设置显示进度条
super.onPreExecute();
/*2.doInBackground方法
运行一个后台线程,该线程实现每arg0[0]毫秒调用一次onProgressUpdate方法
protected String doInBackground(Integer... arg0) {
for(int i=0;i&100;i++)
publishProgress(i);
//调用onProgressUpdate方法并传递参数i
Thread.sleep(arg0[0]); //累加一次,线程休眠argo[0]毫秒
} catch (InterruptedException e) {
e.printStackTrace();
return &下载完毕&;
//后台子线程运行完毕后,返回的值
/*3.onProgressUpdate方法
* 调用publishProgress(i)时调用该方法,并传递参数i给形参values[0]*/
protected void onProgressUpdate(Integer... values) {
pb.setProgress(values[0]);
//设置进度条值
tv.setText(&已经下载&+values[0]+&%&);
//文本组件显示提示信息
super.onProgressUpdate(values);
/*4.onPostExecute
* 处理后台线程得到的结果
protected void onPostExecute(String result) {
pb.setVisibility(View.INVISIBLE); //隐藏进度条
tv.setVisibility(View.VISIBLE); //显示UI文本显示框组件
tv.setText(result);
tv.setTextSize(20);
tv.setTextColor(Color.RED);
super.onPostExecute(result);
doInBackground()方法,以及publishProgress()方法是在子线程中执行的,其他的方法都是在主线程中执行的,所以可以在这些方法中更新界面组件。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:106545次
积分:2515
积分:2515
排名:第10765名
原创:143篇
评论:34条
阅读:4122
文章:24篇
阅读:13830
文章:27篇
阅读:25159
(2)(19)(16)(19)(17)(10)(34)(10)(22)(7)处理异步任务是 AsyncTask好呢,还是Service好?解决方案 - Android当前位置:& &&&处理异步任务是 AsyncTask好呢,还是Service好?解处理异步任务是 AsyncTask好呢,还是Service好?解决方案&&网友分享于:&&浏览:225次处理异步任务是 AsyncTask好呢,还是Service好?如题,欢迎大家讨论。。。------解决方案--------------------Service感觉用在进程间处理通信较多,还有一些系统消息的处理。异步任务还是handler的一种封装,还是进程内使用较多。比如处理多线程等。因为android里activity就是一个线程,它并不关心多线程的问题,多线程都是开发人员自己要做的。
------解决方案--------------------探讨引用:service好点吧IntentService 的好处* Acitivity的进程,当处理Intent的时候,会产生一个对应的Service* Android的进程处理器现在会尽可能的不kill掉你* 非常容易使用当有多个任务时IntentService会阻塞吧,效率不高
------解决方案--------------------
如果你曾研讀過 AsyncTask 的原始碼,你應該知道所有的 AsyncTask實例 (instances),都是由同一個 ThreadPoolExecutor 在管理。每一個 AsyncTask 的實例,都會由 ThreadPoolExecutor 中分配到一個 thread 來執行。因此所有的 AsyncTask 實例都是並行的。要實現一個可支援並行工作的 IntentService,我們剛好可以利用 Service + AsyncTask 的組合。在 IntentServcie 中等待被服務的工作,並不會被一起並行 (Concurrent),而是循序執行。在多數的案例中,循序執行已能滿足你的需求,而且這樣的程式也比較能夠受控制而不會出錯。如何漂亮解決並行下載工作?http://apps./share/detail/
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有事件处理机制之AnsyncTask异步任务
本节给大家带来的是给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧!
(二)AnsyncTask异步任务
1.相关概念
1)什么是多线程:
答:先要了解这几个名称:应用程序,进程,线程,多线程!!
应用程序(Application):为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码)
进程(Process) :运行中的程序,调度与资源分配的一个独立单位,操作系统会为每个进程分配 一段内存空间,程序的依次动态执行,经理代码加载 -& 执行 -& 执行完毕的完整过程!
线程(Thread):比进程更小的执行单元,每个进程可能有多条线程,线程需要放在一个进程中才能执行! 线程是由程序负责管理的!!!而进程则是由系统进行调度的!!!
多线程概念(Multithreading):并行地执行多条指令,将CPU的时间片按照调度算法,分配给各个线程,实际上是分时执行的,只是这个切换的时间很短,用户感觉是同时而已!
举个简单的例子: 你挂着QQ,突然想去听歌,你需要把QQ关掉,然后再去启动XX播放器吗?答案是否定的,我们直接打开播放器 放歌就好,QQ还在运行着,是吧!这就是简单的多线程~在实际开发中,也有这样的例子,比如应用正在运行, 发现新版本了,想后台更新,这个时候一般我们会开辟出一条后台线程,用于新版本的apk,但是这个时候 我们还可以使用应用中的其他功能!这就是多线程的使用例子~
2)同步与异步的概念:
答: 同步:当我们执行某个功能时,在没有得到结果之前,这个调用就不能返回!简单点就是说必须 等前一件事做完才能做下一件事;举个简单的例子:比如你啪啪啪,为了避免弄出人命,肯定要先戴好套套, 然后再啪啪啪是吧~套套戴好 -& 然后啪啪啪,比如你没套套,那啪啪啪的操作就要等待了,直到你把 套套买回来带上,这个时候就可以开始啪啪啪了~一个形象地例子,?(^?^*) 异步:和同步则是相对的,当我们执行某个功能后,我们并不需要立即得到结果,我们额可以正常地 做其他操作,这个功能可以在完成后通知或者回调来告诉我们;还是上面那个后台下载的例子,后台下载, 我们执行下载功能后,我们就无需去关心它的下载过程,当下载完毕后通知我们就可以了~
3) Android为很么要引入异步任务
答:因为Android程序刚启动时,会同时启动一个对应的主线程(Main Thread),这个主线程主要负责处理 与UI相关的事件!有时我们也把他称作UI线程!而在Android App时我们必须遵守这个单线程模型的规则: Android UI操作并不是线程安全的并且这些操作都需要在UI线程中执行! 假如我们在非UI线程中,比如在主线程中new Thread()另外开辟一个线程,然后直接在里面修改UI控件的值; 此时会抛出下述异常: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 另外,还有一点,如果我们把耗时的操作都放在UI线程中的话,如果UI线程超过5s没有响应用于请求,那么 这个时候会引发ANR(Application Not Responding)异常,就是应用无响应~ 最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作~不然会报: android.os.NetworkOnMainThreadException
以上的种种原因都说明了Android引入异步任务的意义,当然实现异步也不可以不用到我们本节讲解 的AsyncTask,我们可以自己开辟一个线程,完成相关操作后,通过下述两种方法进行UI更新:
前面我们学的Handler,我们在Handler里写好UI更新,然后通过sendMessage()等的方法通知UI 更新,另外别忘了Handler写在主线程和子线程中的区别哦~
利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,更新UI时,把Runnable 对象传进来即可~
2.AsyncTask全解析:
1)为什么要用AsyncTask?
答:我们可以用上述两种方法来完成我们的异步操作,加入要我们写的异步操作比较多,或者较为繁琐, 难道我们new Thread()然后用上述方法通知UI更新么?程序员都是比较喜欢偷懒的,既然官方给我 们提供了AsyncTask这个封装好的轻量级异步类,为什么不用呢?我们通过几十行的代码就可以完成 我们的异步操作,而且进度可控;相比起Handler,AsyncTask显得更加简单,快捷~当然,这只适合 简单的异步操作,另外,实际异步用的最多的地方就是网络操作,图片加载,数据传输等,AsyncTask 暂时可以满足初学者的需求,谢谢小应用,但是到了公司真正做项目以后,我们更多的使用第三发的 框架,比如Volley,OkHttp,android-async-http,XUtils等很多,后面进阶教程我们会选1-2个框架进行 学习,当然你可以自己找资料学习学习,但是掌握AsyncTask还是很有必要的!
2)AsyncTask的基本结构:
AsyncTask是一个抽象类,一般我们都会定义一个类继承AsyncTask然后重写相关方法~
构建AsyncTask子类的参数:
相关方法与执行流程:
注意事项:
3.AsyncTask使用示例:
因为我们还没学到Android网络那块,这里照顾下各位初学者,这里用延时 线程来模拟文件下载的过程~后面讲到网络那里再给大家写几个例子~
实现效果图:
布局文件:activity.xml:
定义一个延时操作,用于模拟下载:
public class DelayOperator {
//延时操作,用来模拟下载
public void delay()
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();;
自定义AsyncTask:
public class MyAsyncTask extends AsyncTask
private TextV
private ProgressB
public MyAsyncTask(TextView txt,ProgressBar pgbar)
this.txt =
this.pgbar =
//该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法
//触发onProgressUpdate对UI进行操作
protected String doInBackground(Integer... params) {
DelayOperator dop = new DelayOperator();
int i = 0;
for (i = 10;i &= 100;i+=10)
dop.delay();
publishProgress(i);
i + params[0].intValue() + &&;
//该方法运行在UI线程中,可对UI控件进行设置
protected void onPreExecute() {
txt.setText(&开始执行异步线程~&);
//在doBackground方法中,每次调用publishProgress方法都会触发该方法
//运行在UI线程中,可对UI控件进行操作
protected void onProgressUpdate(Integer... values) {
int value = values[0];
pgbar.setProgress(value);
MainActivity.java:
public class MyActivity extends ActionBarActivity {
private TextV
private ProgressB
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txttitle = (TextView)findViewById(R.id.txttitle);
pgbar = (ProgressBar)findViewById(R.id.pgbar);
btnupdate = (Button)findViewById(R.id.btnupdate);
btnupdate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar);
myTask.execute(1000);
好的,本节一开始给大家普及了下应用程序,进程,线程,多线程,异步,同步的概念;接着又讲解 了下Android中为何要引入异步操作,然后介绍了下AsyncTask的用法,当然上面也说了,异步操作在网络 操作用的较多,后面在讲解网络操作时会用到这个AsyncTask~
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 java异步处理 的文章

 

随机推荐