Android 在Asynctask中执行可运行任务
我有一个类Android 在Asynctask中执行可运行任务,android,android-asynctask,runnable,Android,Android Asynctask,Runnable,我有一个类AsycnIntegerCounter,它扩展了AsyncTask,在同一个类中重写了doInBackground()和onPostExecute()。 从我的主线程,我能够创建一个可运行对象,并使用 AsycnIntegerCounter的静态执行方法AsycnIntegerCounter.execute(可运行) 有谁能帮助我理解当我们使用asycintegercounter(即使用AsycnTask对象)执行runnable时会发生什么 什么时候可以使用?与使用线程对象运行相比,
AsycnIntegerCounter
,它扩展了AsyncTask
,在同一个类中重写了doInBackground()
和onPostExecute()
。
从我的主线程,我能够创建一个可运行对象,并使用
AsycnIntegerCounter
的静态执行方法<代码>AsycnIntegerCounter.execute(可运行)
有谁能帮助我理解当我们使用asycintegercounter
(即使用AsycnTask
对象)执行runnable时会发生什么
什么时候可以使用?与使用线程对象运行相比,它有什么好处?
代码示例:
AsycnIntegerCounter integerCounter1 = new AsycnIntegerCounter(next,0);
AsycnIntegerCounter.execute(new Runnable() {
@Override
public void run() {
int i = 100;
while(i<=105){
i++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
AsycnIntegerCounter integerCounter1=新的AsycnIntegerCounter(下一步,0);
AsycnIntegerCounter.execute(新的Runnable(){
@凌驾
公开募捐{
int i=100;
虽然(i它与execute()
相同,但它将在后台运行Runnable
,而不是运行doInBackround
函数。当您有相同的onPreExecute和onPostExecute,但有多个Runnable时,它会很有用
我想与Thread.execute
或executer
相比,它的优势在于前后调用onPreExecute
和onPostExecute
。据我所知,它类似于AsyncTask
类,但AsynchTask
只运行一次,但在这个类中,它提供了两个功能-:
如果您希望一个任务多次运行,它会循环以使其受益
比如检查web服务上的连续数据
它使用Thread.sleep固定了任务的运行时间,因此如果任务完成
在此之前,它将通过Thread.wait()
修复此任务的时间
@Alex提出了一个很好的观点。假设您有很多方法,M1()
,M2()
,等等,您希望执行。假设在执行其中任何一个方法之前,您需要在()之前执行方法
,在()之后执行方法
即,方法的顺序如下:
Before();
M1();
After();
或
通过将Before()
置于onPreExecute
和Before()
置于onPostExecute
中,可以实现该顺序。通过使M
处于可运行状态,可以实现:
Before();
WhateverRunnableYouWant();
After();
根据您的代码,在后台、非UI线程中运行Runnable
。这两者之间有几个基本的区别
static void execute(Runnable)
和
AsyncTask execute(Params...)
后台任务在Runnable中定义,而不是实现doInBackground
Runnable
-任务未使用AsyncTask
的内部线程通信机制。因此,既不调用onPreExecute
也不调用onPostExecute
后者可用于所有平台,而前者是在API级别11中添加的
使用execute(可运行)的优点
任务可以在内部线程池的工作线程上执行,即不需要创建新线程。没有名为AsyncIntegerCounter的类,是您创建的自定义类吗?是的,Onur,它是一个扩展AsyncTask的类,我在问题中提到过。感谢您回复Alex,但我无法理解以下内容第二部分“当您有相同的onPreExecute和onPostExecute,但有几个runnable时,它会很有用。”此外,当我使用execute()控件执行runnable时,也不会转到onPostExecute()在runnable完成其任务后,这是AsycnIntegerCounter类的预期行为吗?谢谢Neil,但是当我使用execute方法执行runnable时,控件从不转到onPostExecute()或onPreExecute()。在这种情况下,我应该添加任何代码来调用它们吗?请发布AsycnIntegerCounter
来帮助回答这个问题,谢谢。还要注意AsyncTask.execute(…);
使用默认执行器,它是SerialExecutor
AsyncTask execute(Params...)