首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AsyncTask -如何在onPostExecute之后将值传回activity类?

在AsyncTask中,可以通过以下几种方式将值传回activity类:

  1. 使用接口回调:定义一个接口,在AsyncTask中实现该接口,并在onPostExecute方法中调用接口的方法将值传回activity类。activity类需要实现该接口,并在实现的方法中处理传回的值。
代码语言:txt
复制
public interface AsyncTaskListener {
    void onTaskComplete(String result);
}

public class MyAsyncTask extends AsyncTask<Void, Void, String> {
    private AsyncTaskListener listener;

    public MyAsyncTask(AsyncTaskListener listener) {
        this.listener = listener;
    }

    @Override
    protected String doInBackground(Void... voids) {
        // 后台任务逻辑
        return "结果";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        listener.onTaskComplete(result);
    }
}

public class MainActivity extends AppCompatActivity implements AsyncTaskListener {
    private TextView resultTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        resultTextView = findViewById(R.id.resultTextView);

        MyAsyncTask myAsyncTask = new MyAsyncTask(this);
        myAsyncTask.execute();
    }

    @Override
    public void onTaskComplete(String result) {
        resultTextView.setText(result);
    }
}
  1. 使用广播:在AsyncTask中发送一个自定义广播,在activity类中注册该广播,并在广播接收器中处理传回的值。
代码语言:txt
复制
public class MyAsyncTask extends AsyncTask<Void, Void, String> {
    private Context context;

    public MyAsyncTask(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(Void... voids) {
        // 后台任务逻辑
        return "结果";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Intent intent = new Intent("com.example.RESULT_ACTION");
        intent.putExtra("result", result);
        context.sendBroadcast(intent);
    }
}

public class MainActivity extends AppCompatActivity {
    private TextView resultTextView;
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String result = intent.getStringExtra("result");
            resultTextView.setText(result);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        resultTextView = findViewById(R.id.resultTextView);

        IntentFilter filter = new IntentFilter("com.example.RESULT_ACTION");
        registerReceiver(receiver, filter);

        MyAsyncTask myAsyncTask = new MyAsyncTask(this);
        myAsyncTask.execute();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}
  1. 使用EventBus:EventBus是一个开源的事件总线库,可以用于组件间的通信。在AsyncTask中发布一个事件,在activity类中订阅该事件,并在订阅方法中处理传回的值。
代码语言:txt
复制
public class MyAsyncTask extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... voids) {
        // 后台任务逻辑
        return "结果";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        EventBus.getDefault().post(new TaskCompleteEvent(result));
    }
}

public class TaskCompleteEvent {
    private String result;

    public TaskCompleteEvent(String result) {
        this.result = result;
    }

    public String getResult() {
        return result;
    }
}

public class MainActivity extends AppCompatActivity {
    private TextView resultTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        resultTextView = findViewById(R.id.resultTextView);

        EventBus.getDefault().register(this);

        MyAsyncTask myAsyncTask = new MyAsyncTask();
        myAsyncTask.execute();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onTaskComplete(TaskCompleteEvent event) {
        resultTextView.setText(event.getResult());
    }
}

以上是三种常用的方式,可以根据具体需求选择适合的方式将值传回activity类。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android多线程:AsyncTask使用教程(含实例讲解)

前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread 实现Runnable接口 Handler AsyncTask HandlerThread 今天,我献上一份...作用 实现多线程 在工作线程中执行任务, 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间的通信,即:工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作 从而保证线程安全...优点 方便实现异步通信 不需使用 “任务线程(继承Thread) + Handler”的复杂组合 节省资源 采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销...doInBackground(String... params) { ...// 自定义的线程任务 // 可调用publishProgress()显示进度, 之后执行...(count<99) { count += length; // 可调用publishProgress()显示进度, 之后执行

70620

Android 多线程:这是一份详细的AsyncTask使用教程

前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread 实现Runnable接口 Handler AsyncTask HandlerThread 今天,我献上一份...作用 实现多线程 在工作线程中执行任务, 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间的通信,即:工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作...优点 方便实现异步通信 不需使用 “任务线程(继承Thread) + Handler”的复杂组合 节省资源 采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销...doInBackground(String... params) { ...// 自定义的线程任务 // 可调用publishProgress()显示进度, 之后执行...(count<99) { count += length; // 可调用publishProgress()显示进度, 之后执行

1.2K30

Android多线程-AsyncTaskyi(一)

今天分析android的异步线程HandlerThread与IntentService,它们都是android系统独有的线程,而android中还有另一个比较重要的异步线程AsyncTask。..., Result> { 由声明可以看出AsyncTask抽象确实定义了三种泛型类型 Params,Progress和Result,它们分别含义如下: Params :启动任务执行的输入参数,HTTP...super.onCancelled(); } } 代码所示,我们创建一个继承自AsyncTask的异步线程,在泛型参数方面,传递String类型(Url) , Integer类型(显示进度)...(4)onPostExecute(Result), 在主线程中执行,在doInBackground 执行完成后,onPostExecute 方法将被UI线程调用,doInBackground 方法的返回将作为此方法的参数传递到...,而在android 3.0之后 ,为了避免AsyncTask处理任务时所带来的并发错误,AsyncTask则采用了单线程串行执行任务。

61120

Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

AsyncTask是一个抽象的泛型,其的声明如下: public abstract class AsyncTask 其中三个泛型参数代表的意义如下...: Parmas:参数类型 Progress:异步任务的执行进度类型 Result:异步任务执行完毕后返回结果的类型 在使用AsyncTask执行异步任务需要创建一个,让这个继承AsyncTask,...2、在外界调用AsyncTask.execute方法之后,开始启动AsyncTask任务,根据代码查看调用过程如下: @MainThread public final AsyncTask<Params,...接着调用了doInBackground方法并获取了返回,然后返回传递给postResult()方法,再看postResult方法的源码如下: private Result postResult(Result...InternalHandler返回结果发送到onPostExecute中,该方法是运行在主线程中。

52730

AsyncTask解析

概述 AsyncTask是一个抽象,它是Android封装的一个轻量级异步操作的。它可以在线程池中执行后台任务,然后把执行的进度和最终的结果传递到主线程,并在主线程中更新UI。...AsyncTask简介 AsyncTask的泛型参数 AsyncTask声明: public abstract class AsyncTask 泛型参数说明...内存泄漏 如果AsyncTask被声明为Activity的非静态内部类,那么AsyncTask会保留一个对创建了AsyncTaskActivity的引用。...如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。...结果丢失 屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask(非静态的内部类)会持有一个之前Activity的引用,这个引用已经无效,这时调用

57510

Android 学习笔记思考篇

不能的话怎么手动维护这些 AsyncTask 啊? 异步任务执行完之后我们想直接显示个对话框行不行?什么?得先判断 Activity 的状态才能显示?不判断好像也没什么问题啊?...异步 Android 中的异步操作基本都是使用 Java 语言内置的,唯一的简单封装的异步 AsyncTask 有几个主要回调,我们可以通过这些回调指定那些代码在异步任务开始之前执行,哪些代码在异步任务中执行...这个设定真的是太难以接受了 作者在封装 AsyncTask 这个时多个任务是在一个后台线程中串行执行的,后来才意识到这样效率太低了就从 Android 1.6(API Level 4)开始改成并行执行了...实现的,但是我们想一下,如果我们不使用 AsyncTask 而是自己封装一个异步任务执行的辅助,我们该怎么设计?...退出后它依然引用着这个 Activity,导致这个 Activity 即使退出了也无法被回收 其它内存泄漏的用例我们就不一一列举,因为真的很多,我们也意识到,只要稍微不小心就很容易写出内存泄漏的代码,

58210

Android 多线程的几种方式

publishProgress()发消息 传递给onProgressUpdate()作为参数 一般用来更新进度条 第三个String代表任务结束的产出类型,也就是doInBackground()的返回类型...,和onPostExecute()的参数类型 注意点 AsyncTask使用过程中需要注意的地方不少: 1) 由于Handler需要和主线程交互,而Handler又是内置于AsnycTask中的,所以,...而且从源码看,如果这个任务已经执行了这个时候调用cancel是不会真正的把task结束,而是继续执行,只不过改变的是执行之后的回调方法是onPostExecute还是onCancelled。...当一个新的Activity被重新创建之后,就又重新启动了一个新的任务去请求网络,这样之前的一个异步任务不经意间就泄露了,假设你还在onPostExecute写了一些其他逻辑,这个时候就会发生意想不到异常...但是,对于AsyncTask怎么办?问题产生的根源在于Activity销毁重新创建的过程中AsyncTask和之前的Activity失联,最终导致一些问题。

80020

【Android开发进阶系列】多线程专题

多个异步任务的更新UI; 5 AsyncTask 5.1 AsyncTask简介         AsyncTask是一个抽象,它是由Android封装的一个轻量级异步(轻量体现在使用方便、代码简洁...5.1.1 AsyncTask的泛型参数         AsyncTask声明如下: public abstract class AsyncTask     AsyncTask是一个抽象泛型。...有了这三个参数类型之后,也就控制了这个AsyncTask子类各个阶段的返回类型,如果有不同业务,我们就需要再另写一个AsyncTask的子类进行处理。...InternalHandler是一个静态,为了能够执行环境切换到主线程,因此这个必须在主线程中进行加载。所以变相要求AsyncTask必须在主线程中进行加载。         ...,那么AsyncTask会保留一个对创建了AsyncTaskActivity的引用。

29230

Android AsyncTask实现原理和使用技巧分享

为什么要用AsyncTask 我们写App都有一个原则,主线程不能够运行需要占用大量CPU时间片的任务,大量复杂的浮点运算,较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝...架包提供的并发实现的,上面的二个需求都已经帮我们封装了,这也是我们选择AsyncTask的原因。...我们先新建一个DemoAsyncTask继承AsyncTask,因为AsyncTask是抽象,其中doInBackground方法必须重写。...现在我们回过头来看,AsyncTask其实只是对JDK 1.5提供的高级并发特性,concurrent架包做的一个封装,方便开发者来处理异步任务,当然里面还有很多细节处理的方法值得大家学习,任务执行进度的反馈...正在后台执行一个任务,可能耗时较长,那用户可能会点击返回退出Activity或者退出App,那么后台任务不会立即退出,如果AsyncTask内部有Activity中成员变量的引用,还会造成Activity

30830

Android AsyncTask实现原理和使用技巧分享

为什么要用AsyncTask 我们写App都有一个原则,主线程不能够运行需要占用大量CPU时间片的任务,大量复杂的浮点运算,较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝...架包提供的并发实现的,上面的二个需求都已经帮我们封装了,这也是我们选择AsyncTask的原因。...我们先新建一个DemoAsyncTask继承AsyncTask,因为AsyncTask是抽象,其中doInBackground方法必须重写。...现在我们回过头来看,AsyncTask其实只是对JDK 1.5提供的高级并发特性,concurrent架包做的一个封装,方便开发者来处理异步任务,当然里面还有很多细节处理的方法值得大家学习,任务执行进度的反馈...正在后台执行一个任务,可能耗时较长,那用户可能会点击返回退出Activity或者退出App,那么后台任务不会立即退出,如果AsyncTask内部有Activity中成员变量的引用,还会造成Activity

73430

Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

AsyncTask是一个抽象的泛型,其的声明如下: public abstract class AsyncTask 其中三个泛型参数代表的意义如下...: Parmas:参数类型 Progress:异步任务的执行进度类型 Result:异步任务执行完毕后返回结果的类型 在使用AsyncTask执行异步任务需要创建一个,让这个继承AsyncTask,...2、在外界调用AsyncTask.execute方法之后,开始启动AsyncTask任务,根据代码查看调用过程如下: @MainThread public final AsyncTask<Params,...接着调用了doInBackground方法并获取了返回,然后返回传递给postResult()方法,再看postResult方法的源码如下: private Result postResult(Result...InternalHandler返回结果发送到onPostExecute中,该方法是运行在主线程中。

52320

Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

AsyncTask是一个抽象的泛型,其的声明如下: public abstract class AsyncTask 其中三个泛型参数代表的意义如下...: Parmas:参数类型 Progress:异步任务的执行进度类型 Result:异步任务执行完毕后返回结果的类型 在使用AsyncTask执行异步任务需要创建一个,让这个继承AsyncTask,...2、在外界调用AsyncTask.execute方法之后,开始启动AsyncTask任务,根据代码查看调用过程如下: @MainThread public final AsyncTask<Params,...接着调用了doInBackground方法并获取了返回,然后返回传递给postResult()方法,再看postResult方法的源码如下: private Result postResult(Result...InternalHandler返回结果发送到onPostExecute中,该方法是运行在主线程中。

1.1K70

asynctask使用_androidstudiohelloworld教程

这是Google Android 开发文档上关于AsyncTask的介绍,大概意思是AsyncTask设计为一个对于Thread和Handle的辅助,主要让开发者方便的使用UI Thread和后台Thread...而传入的参数就是doInBackground方法的返回,该类型由上文的Result指定。 繁杂部分和源码浅析 上面基本讲解了AsyncTask的使用方法了。...区别在于调用这个方法后,doInBackground执行完成时会调用onCancelled方法,而不是onPostExecute方法,所以cancel无法保证任务能够被取消 内存泄漏 上面的示列代码从Activity...而AsyncTask的生命周期和Activity是无关的,那么当Activity被finish后,AsyncTask依然存在,而他持有着Activity的引用导致Activity无法被垃圾回收。...同时如果使用了非静态匿名内部类来实现AsyncTask,由于Java内部类的特点,他同样会持有当前Activity的引用造成内存泄漏。

30620

Android AsyncTask异步处理

确保只在UI线程中访问Android UI工具包      当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,:用户的按键事件...为了解决这个问题,Android 1.5提供了一个工具AsyncTask 它使创建需要与用户界面交互的长时间运行的任务变得更简单,不需要借助线程和Handler即可实现。 ...AsyncTask是抽象,它定义了三种泛型类型: Params,Progress,Result   Params 启动任务执行的输入参数,比如HTTP请求的URL。    ...(d)onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果通过该方法传递到UI thread...为了正确的使用AsyncTask,以下是几条必须遵守的准则:  1) Task的实例必须在UI thread中创建  2) execute方法必须在UI thread中调用  3) 不要手动的调用onPreExecute

1.2K30

译文:Android中糟糕的AsyncTask

的cancel方法需要一个布尔的参数,参数名为mayInterruptIfRunning,意思是如果正在执行是否可以打断,如果这个设置为true,表示这个任务可以被打断,否则,正在执行的程序会继续执行直到完成...如果你调用了AsyncTask的cancel(false),doInBackground()仍然会执行到方法结束,只是不会去调用onPostExecute()方法。...内存泄露 还有一种常见的情况就是,在Activity中使用非静态匿名内部AsyncTask,由于Java内部类的特点,AsyncTask内部类会持有外部类的隐式引用。...当Activity销毁并创新创建后,还在运行的AsyncTask会持有一个Activity的非法引用即之前的Activity实例。导致onPostExecute()没有任何作用。...(); 上面的两个任务时同时执行呢,还是AsyncTask1执行结束之后AsyncTask2才能执行呢?

58210

【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )

AsyncTask 三个泛型解析 泛型 1: 异步任务开始时 , execute 方法传入的参数类型 泛型 2 : 异步任务执行时 , 进度类型...任务管理 : 开发 JobScheduleManager 管理 , 该类负责与 Service 服务中的需求对接 , 接收 Service 服务中的添加任务的需求 , 任务操作转为参数 , 并提交到系统...任务执行服务 : 开发 JobService 服务 , 该服务是执行具体的任务的 , 在该类中 , 接收到系统调度的任务参数 , 在 onStartJob 方法中解析这些参数 , 并创建 AsyncTask...与 AsyncTask 代码示例 : 注意 JobService 的两个方法 onStartJob , onStopJob 的调用时机 , 与返回含义 ; 注意 AsyncTask 定义时三个泛型的含义...异步任务执行时 , 进度类型 * -- 3.

1.2K00

Android设计模式应用-模板方法模式

android里面最常见的  模板方法就是:android的activity的生命周期,一个activity从创建到销毁是有一个过程的,oncreate,onstart,onresume,onpause...|- 然后从线程池中取出若干个空闲的线程,并使用该线程调用doInBackground方法,执行耗时的操作,文件下载等。...|- 当doInBackground方法执行完毕后,onPostExecute方法将被调用。onPostExecute方法的参数就是doInBackground方法的返回。...在上面的范例中,各个方法的参数、返回都是Object类型的,这对于严格控制程序有很大负面的影响。但是事实上,AsyncTask是有泛型的。...|- Result:用于设置onPostExecute方法的参数的数据类型和doInBackground方法的返回类型。

43520
领券