首页
学习
活动
专区
工具
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接口定义语言)可以辅助生成BinderJava,减少重复工作,使用姿势网上有很多,这里就直接手写吧,方便理解。...reply客户端写返回值 reply.writeString(str); //3....服务端与驱动交互 「一图摸清Android应用进程启动」一文可知,服务端创建了一个线程注册进binder驱动,即binder线程,在ProcessState.cpp, //ProcessState.cpp...= -EBADF); //binder驱动写数据(退出循环,线程结束) mOut.writeInt32(BC_EXIT_LOOPER); } //1.1 等待指令到来 status_t

92820

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

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

50000
  • 【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 提升app性能和质量

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

    93440

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

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

    2.3K10

    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返回是Javaclass对象,可以通过这个对象去调用调用Java反射内容。

    3.2K10

    Android事件处理机制

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

    87130

    深入理解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实体,线程T1Client进程C1中通过Binder引用进程S发送请求。S为了处理这个请求需要启动线程T2,而此时线程T1处于接收返回数据等待状态。

    1.1K70

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

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

    1.2K31

    Android内存泄漏分享

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

    1.2K60

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

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

    1.4K10

    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所得到布局大小和布局参数

    90520

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

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

    50810

    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???

    98920

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

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

    59580

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

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

    1.3K80

    线程故事:我3位母亲成就了优秀我!

    new MyThread(); // 启动线程 thread.start(); } } 变种方法 以上创建线程方式略显繁琐,我们也可以使用匿名对象方式,在创建...Thread 时候就直接重写 run() 方法,实现代码如下: // 变种 1:匿名方式创建线程 Thread t1 = new Thread() { @Override public...匿名Runnable 以上实现 Runnable 接口有更简单实现方法,我们可以使用匿名 Runnable 来创建一个线程,如下代码所示: // 变种 1:匿名 Runnable 方式 Thread...Runnable ,我们也有了更简单实现方法,如下代码所示: // 变种 2:使用 Lambda 匿名 Runnable 方式 Thread t3 = new Thread(() -> {...以上结果可以看出,使用 Callable 配合 FutrueTask 可以正确拿到线程执行之后返回值

    35120
    领券