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

Android:从匿名类向线程返回值的正确方法是什么?

Android中,从匿名类向线程返回值的正确方法是使用回调函数或者使用Handler机制。

  1. 使用回调函数:定义一个接口,接口中定义一个方法用于返回结果。在匿名类中调用该方法,并将结果作为参数传递给该方法。在调用匿名类的地方,实现接口并重写方法,即可获取返回的结果。

示例代码如下:

代码语言:java
复制
public interface Callback {
    void onResult(String result);
}

public class MyThread extends Thread {
    private Callback callback;

    public MyThread(Callback callback) {
        this.callback = callback;
    }

    @Override
    public void run() {
        // 执行耗时操作
        String result = "Hello World";
        callback.onResult(result);
    }
}

// 在调用处
MyThread myThread = new MyThread(new Callback() {
    @Override
    public void onResult(String result) {
        // 处理返回结果
        Log.d(TAG, "Result: " + result);
    }
});
myThread.start();
  1. 使用Handler机制:在主线程中创建一个Handler对象,并重写其handleMessage()方法,用于处理子线程返回的消息。在匿名类中通过Handler对象发送消息,并在handleMessage()方法中处理返回的结果。

示例代码如下:

代码语言:java
复制
public class MyThread extends Thread {
    private Handler handler;

    public MyThread(Handler handler) {
        this.handler = handler;
    }

    @Override
    public void run() {
        // 执行耗时操作
        String result = "Hello World";
        Message message = handler.obtainMessage();
        message.obj = result;
        handler.sendMessage(message);
    }
}

// 在主线程中
Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        String result = (String) msg.obj;
        // 处理返回结果
        Log.d(TAG, "Result: " + result);
    }
};

MyThread myThread = new MyThread(handler);
myThread.start();

以上两种方法都可以实现从匿名类向线程返回值的功能,具体选择哪种方法取决于具体的需求和场景。

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

相关·内容

图解 | Binder浅析(一)

Android基于shm改进得到匿名共享内存Ashmem(Anonymous Shared Memory),因高效而适合处理较大的数据,如应用进程通过共享内存来读取SurfaceFlinger进程合成的视图数据...(两端通过ioctl与驱动交互) 简单示例 AIDL(Android接口定义语言)可以辅助生成Binder的Java类,减少重复工作,使用姿势网上有很多,这里就直接手写吧,方便理解。...从reply向客户端写返回值 reply.writeString(str); //3....服务端与驱动交互 从「一图摸清Android应用进程的启动」一文可知,服务端创建了一个线程注册进binder驱动,即binder线程,在ProcessState.cpp, //ProcessState.cpp...= -EBADF); //向binder驱动写数据(退出循环,线程结束) mOut.writeInt32(BC_EXIT_LOOPER); } //1.1 等待指令的到来 status_t

95220

Android面试知识笔记:那些年面试官常问的知识点...(附详细解析)

有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。...-- android:priority属性是设置此接收者的优先级(从-1000到1000) --> android:priority="20"> 方法停止 2、在Service内部(onStartCommand方法内)使用stopSelf onStartCommand方法的返回值 1、START_NOT_STICKY...从顶层父View向子View递归调用 layout 方法的过程,即父View根据上一步 measure 得到的布局大小和布局参数,将子View放在合适的位置上。 第三步:onDraw 绘制视图。...Handler实现原理 Android的主线程不能进行耗时操作,子线程不能进行更新UI,所以就有了Handler,它的作用就是实现线程之间的通信。

50700
  • Android高级:内部类的理解,多态,run和start,wait和seelp,线程安全,堆和栈,synchronized 和volatile ,AsyncTask,Binder的机,view的原理

    成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用 java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类...从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名 Class类型,所在包、具有的所有方法 Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性...Binder的工作机制 直观来说,Binder是Android中的一个类,它实现了IBinder接口,从IPC的角度来说,Binder是Android中的一种跨进程通信的一种方式,同时还可以理解为是一种虚拟的物理设备...,服务端通过code可以确定客户端所请求的目标方法是什么,接着从data中取出目标方法所需的参数,然后执行目标方法。...注意:在activity的生命周期中是没有办法正确的获取view的宽高的,原因就是view没有测量完。

    7400

    【Kotlin 协程】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

    文章目录 一、以异步返回返回多个返回值 二、同步调用返回多个值的弊端 三、尝试在 sequence 中调用挂起函数返回多个返回值 四、协程中调用挂起函数返回集合 一、以异步返回返回多个返回值 ----..., 该函数 () -> Unit 是 SequenceScope 类型的扩展函数 ; 任意传入一个匿名函数 , 该函数被自动设置为 SequenceScope 类的扩展函数 , 在其中的任何调用都默认调用的是...SequenceScope 对象的方法 ; 在该匿名函数中 , 不能调用 SequenceScope 之外定义的挂起函数 , 这样做是为了保证该类的执行性能 ; /** * 构建一个[Sequence...sequence 方法中传入一个函数 , 该函数就会变成 SequenceScope 的扩展函数 , SequenceScope 类中的扩展函数是限制挂起的 , 只要是 SequenceScope 中...; /** * 当用作扩展挂起函数的接收器时,标记有此注释的类和接口受到限制。

    8.3K30

    Android面试大纲(集合)

    ,复写onReceiver() 通过Binder机制向AMS进行注册广播 广播发送者通过Binder机制向AMS发送广播 AMS查找符合相应条件的广播发送到BroadcastReceiver相应的循环队列中...,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可通过使用Java反射机制利用该漏洞执行任意Java对象的方法 2、WebView销毁步骤 WebView...()方法,拿到Proxy代理类 通过调用Proxy代理类的方法,将参数进行封包后,调用底层的transact()方法 transact()方法会回调onTransact()方法,进行参数的解封 在onTransact...()方法中调用服务端对应的方法,并将结果返回 6 Handler面试题 1、Handler是什么 Handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue...1、AsyncTask是什么 它本质上就是一个封装了线程池和Handler的异步框架 2、AsyncTask使用方法 三个参数 Params:表示后台任务执行时的参数类型,该参数会传给AysncTask

    1.1K20

    如何用 Android vitals 解决应用程序的质量问题

    了解你的应用是否在驱动过多的唤醒是 Android vitals 的重要任务。收集的有关你应用行为的匿名数据用于显示自设备完全充电后,每小时经历超过 10 次唤醒的用户的百分比。...如果你决定必须使用唤醒警报,那么如果你提供了符合以下要求的警报标签,则 Play Console 可以提供更好的分析数据: 在你的警报标签名称中包含你的包名、类名或方法名。...你可以通过 APK 版本号、支持的设备、操作系统版本和时间段来过滤这些数据。 ? 你还可以从 ANRs & crashes 部分获取更多详细信息。 ? ANR 的常见原因是什么?...可以考虑调整包含数百万像素的大图像的大小,或解析大块的 HTML 文本,然后在 TextView 中显示。一般来说,最好让你的应用在后台执行这些操作。 从主线程向另一个进程运行同步绑定调用。...我如何检测 ANR 的原因? 查找 ANR 的原因可能会非常棘手,就拿 URL 类来说吧。 你觉得确定两个 URL 是否相同的 URL#equals 方法是否会被阻塞?

    2.3K10

    Android vitals 提升app性能和质量

    通过分析Android vitals 提供一些参考指标,工程师可以采取正确的措施来优化app,如上通过仪表盘可以看到从设备收集的如下的数据: Stability: ANR rate & crash rate...在理想情况下,从磁盘上读取几个字节的数据并不会引发 ANR,但是这绝对不是什么好主意。...总的来说,还是让应用在后台运行此类操作比较合适; 向主线程另一进程同步调用binder:与磁盘或网络操作相似,在线程间进行阻塞调用时,程序执行会被转移到您无法控制的地方。如果说其它进程忙碌,该怎么办?...产生问题的可能的源头有:长耗时计算、IO操作、锁竞争、死锁、慢广播处理。 Android vitals 能收集并利用应用 ANR 事件的匿名数据,提供多个级别的 ANR 具体报告。...若您认为使用唤醒闹钟无法避免,那么如果您的闹钟标签满足以下要求,Play Console 可以提供更好的分析数据: 在闹钟标签中包含包、类或者方法名称。

    95340

    AIDL是什么

    前言 AIDL是什么?还记得好多面试知识点中提到,应用之间的跨进程通信有哪些方式,AIDL好几次被作为正确答案来说,其实这是大错特错,其实AIDL就是帮程序员偷懒的封装类。...当进程B通过调用BinderProxy的对象来与进程A中Binder类进行跨进程通信,具体怎么调用的请看下图: ?...requestID调用对应的代码了,可以理解为方法名 data:可以理解为方法中的参数 reply:方法的返回值 flag:这个flag代表Binder通信是否是同步还是异步,暂时可以忽略。...如果大家去看看AIDL生成java类,里面做的事情就是这样子。...正确android中跨进程通信的方式主要有以下三类: 1.socket通信,应用A初始化请求Zygote孵化出新的进程 2.匿名共享内存,因为Binder不支持图像这样子的大数据传输,所以用匿名共享内存传输应用界面的图像到

    1.4K31

    是时候使用Kotlin编程了

    举个列子,Java字节码有几种函数调用的方式invokespecial 、 invokeStatic 、 invokeInterface等,编译器必须知道调用的Java函数是什么类型才能生成相应的正确的字节码...调用上面集合的方式如下: 6,伴生对象 Kotlin中没有静态属性和方法,如果我们要创建单列,可以使用Object关键字声明类。...调用如下: 5,Lambda表达式支持 Lambda表达式的本质是一个未声明的函数,他会以表达式的形式传递。既然是函数,就由这三块组成:参数 、 方法体 和 返回值。...例如,下面是一个典型的Lambda表达式。 可以看到,Lambda表达式的大括号内,箭头左边是参数,箭头右侧是方法体和返回值。 调用上面的函数,可以使用下面的调用方式。...反射可以获取类的方法,属性,类结构等所有信息。 在Kotlin中使用Java的反射的实例如下: jc返回的是Java的class对象,可以通过这个对象去调用调用Java的反射内容。

    3.3K10

    Android事件处理机制

    3.2基于回调事件的传播流程 几乎所有基于回调的事件都有一个boolean类型的返回值,发方法用于标识该处理方法是否能够完全处理该事件 (1),如果处理事件的回调方法返回的值为true,则表明该处理方法已完全处理该事件...()方法,而且重写了该EditText所在的Activity类的onKeyDown()方法,由于程序中没有阻止事件的传播,所以程序中可以看到事件从RditText传播到Activity的全过程...3.3基于回调触摸事件处理 屏幕事件的处理方法onTouchEvent(),该方法的返回值与键盘响应事件相同,都是当程序完整的处理的该事件,且不希望其他回调方法再次处理该事件时返回true,...,所以主线程又叫UI线程,故android平台只允许Ui线程修改activity的ui组件,新的进程需要动态改变界面组件的属性值时,就需要用到Handler了 4.1Handler类简介 Handler...类主要有两个作用:在新启动的线程中发送消息,在主线程中获取和处理消息 只能通过回调的方法来实现-开发者只需要重写Handler类中处理的消息的方法即可,当新启动的线程发送消息时,消息会发送到与之关联的

    88930

    深入理解Android IPC机制之Binder机制

    与其它IPC不同,Binder是一个实体位于Server中的对象,该对象提供了一套方法用以实现对服务的请求,就像类的成员函数。...3.4 匿名 Binder 其实,Android系统还支持匿名BInder,并不是所有Binder都需要注册给SMgr。...由于这个Binder没有向SMgr注册名字,所以是个匿名Binder。Client将会收到这个匿名Binder的引用,通过这个引用向位于Server中的实体发送请求。...匿名Binder为通信双方建立一条私密通道,只要Server没有把匿名Binder发给别的进程,别的进程就无法通过穷举或猜测等任何方式获得该Binder的引用,向该Binder发送请求。...假如进程S是Server端,提供Binder实体,线程T1从Client进程C1中通过Binder的引用向进程S发送请求。S为了处理这个请求需要启动线程T2,而此时线程T1处于接收返回数据的等待状态。

    1.1K70

    Android内存泄漏分享

    为了避免对象无法正确、及时被释放,需要理解: GC如何回收对象,如何释放对象? 对象的引用 对象的使用是通过指向它的引用被访问的,引用被保存在引用类型变量中。...这里变量指: 类变量:静态成员变量,成员变量也叫字段。 实例变量:非静态成员变量。 局部变量:在方法中定义,赋值和使用。 不考虑:参数、返回值、常量。...需要注意一些方法中的变量的及时释放。...及时释放引用 能使用局部变量的,就不要使用字段。方法中,释放那些不使用又继续占有的对象引用。 四大组件对象不是由我们new的,有其明确的生命周期,在“销毁”动作时从对象引用层面释放该释放的。...通常,一个包含更多其它对象的大对象的释放,顺带解决了很多对象的泄漏。 匿名内部类 网络,语音,线程,其它异步操作,如果使用到callBack/Listener对象,应该注意这些对象的释放。

    1.2K60

    Android性能优化(十一)之正确的异步姿势

    Android开发中我们使用异步来进行耗时操作,异步离不开一个词:线程。那么问题来了: Android中线程调度是如何实现的? 正确的异步姿势是什么呢? 线程池一定会提升效率吗?...那今天这篇文章我们就来聊聊Android中正确的异步姿势。 2、 Android线程调度 Android的线程调度由两个主要因素来决定如何在整个系统调度线程:nice values和cgroups。...总结: 高Nice Value对应较低的线程优先级,意味着更少的执行机会,让步于高优先级的UI线程; Cgroups可以更好的凸显某类线程的优先级,Android中有两类group尤其重要:一类是default...备注:对于AsyncTask正确的使用姿势,就是区分场景调用不同的执行方法;并且避免出现内存泄漏的问题。...备注:HandlerThread的正确使用姿势:串行场景,并在构造方法中明确指定优先级。

    1.3K31

    Android vitals 帮您解决应用质量问题

    通过收集有关应用行为的匿名数据,Android vitals 可以显示有多少比例的用户在设备满电之后,每小时经历 10 次以上的设备唤醒。...若您认为使用唤醒闹钟无法避免,那么如果您的闹钟标签满足以下要求,Play Console 可以提供更好的分析数据: 在闹钟标签中包含包、类或者方法名称。...Android vitals 能收集并利用应用 ANR 事件的匿名数据,提供多个级别的 ANR 具体报告。...在理想情况下,从磁盘上读取几个字节的数据并不会引发 ANR,但是这绝对不是什么好主意。...如何检测应用程序无法响应原因 寻找触发 ANR 的原因不容易,我们拿 URL 类举个例子: 您想看到 URL#equals (判断两个 URL 是否相同的方法) 阻塞线程吗?

    1.5K10

    2021年Android面试题及答案收集(不断更新中)

    9.成员内部类、静态内部类、局部内部类、和匿名内部类的理解 10.Java的垃圾回收机制及其在何时会被触发 11.Java中的代理是什么?静态代理和动态代理的区别是什么?...9.成员内部类、静态内部类、局部内部类、和匿名内部类的理解 Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域中)、匿名内部类(无构造方法)、静态内部类(由static修饰的类、不能使用任何外围类的非...从对象出发,通过反射(.class类)可以获取到类的完整信息,(类名、class类型、所在包、具有的所有方法Method[]类型、某个方法的完整信息,包括修饰符、返回值类型、异常、参数类型、所有属性Field...)方法的返回值,使用FutureTask对象作为Thread对象的target创建并启动线程,调用FutureTask对象的get( )方法来获得子线程执行结束后的返回值。...OnLayout():确定View的位置,进行页面的布局,从顶层父View向子View的递归调用View.Layout方法的过程,即父View根据上一步measure子View所得到的布局大小和布局参数

    90620

    面试涨薪攻略指南:Android面试必须掌握的那些Java知识点

    修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法? Java中实现多态的机制是什么? 如何将一个Java对象序列化到文件里?...内部类的作用 内部类可直接访问外部类的属性 Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static...9、成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用 ava中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类...14、Java中实现多态的机制是什么?...从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名 Class类型,所在包、具有的所有方法 Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性

    51410

    From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了

    --- Android 官方开发语言从Java变为Kotlin,Java 有哪些问题?...从语法上看,扩展看起来就像是我们从类的外部为它扩展了新的成员。...扩展函数 扩展函数,就是从类的外部扩展出来的一个函数,这个函数看起来就像是类的成员函数一样 Extension.kt /* ① ② ③ ④ ↓ ↓...每个接口定义了一个invoke()方法,调用这个方法就会执行函数。一个函数类型的变量就是实现了对应的FunctionN接口的实现类的实例。...图片 这几个个报错是因为,匿名函数是把函数的声明与函数引用合二为一了,所以在需要匿名函数的地方,声明一个具名函数是报错的,正确的做法是改用具名函数引用 例如: higherOrderAdd(2,2

    1.3K80

    Java中的小知识——lambda表达式

    从匿名内部类引入Lambda表达式 在线程池那篇博客中,我们通过使用匿名内部类来作为参数传入submit方法中。 ?...那我们就用更简单的lambda表达式来代替匿名内部类。...Lambda表达式 思想 "说重点" lambda表达式的核心即在于说重点 以线程代码为例,他需要的是什么?最核心的东西是什么? 就是run方法!!!...runnable接口中重写实现的就一个run方法!!!接口只是run方法的载体,装黄桃的罐头盒子!!!核心只要run方法。 我们为什么要写runnable接口的实现类?...这个方法需要的参数是Runnable接口的实现类对象 2. Runnable接口目标是为了提供一个run 方法, What will be run 3. What will be run???

    99320

    Java 8 新特性(一)lambda表达式

    我们在编写多线程代码的时候,常常需要编写实现Runnable的类。有时候为了省事,我们会写成匿名内部类的形式。...由于Runnable接口内只有一个方法,所以它是一个SAM接口,我们可以用lambda表达式改写它。那么改写之后是什么样子的呢?不要惊讶,只需要一行代码。...值得注意的是最后一个例子,如果方法体本身足够简单,可以直接将返回值表达式写在lambda表达式的右边,编译器也会正确对待这种情况。...方法引用是一个新语法,如果见到了不要奇怪,这也是正确的Java代码。...同学们最好对这些函数接口的形式稍作了解,以后碰到的时候就不会一头雾水了。 ? lambda表达式应用 编写线程 前面提到了,可以使用lambda表达式简化线程代码的编写,不再需要冗长的匿名内部类。

    61780
    领券