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...)