安卓中子线程传值的问题

2018-12-11 21:21:38 +08:00
 yuanxx9608
安卓开发里,网络请求需要创建子线程,怎么把值传到主线程呢?
9043 次点击
所在节点    Android
11 条回复
electronic
2018-12-11 21:47:54 +08:00
Handler Message
insomnia1232
2018-12-11 22:16:19 +08:00
这种最基础的东西百度一下都比来这强
xbigfat
2018-12-11 22:29:31 +08:00
同意楼上的观点,但是猜测你可能是新手所以没有百度,相信 v2er 们的回答。
我的回答是:
Android 不允许在主线程中进行网络请求,所以可以通过异步回调的方式将网络请求结果分发到主线程中。
几乎都是通过这个方式来进行的。
厉害一点的可以用 RxJava、Retrofit、或者 OkHttpClient 发起请求。
Handler + Message 也可以,但是容易造成内存泄漏的问题。
我喜欢的方法是用 JDK 里面的 HttpUrlConnection + Thread + 手写 interface 做回调。
(回答错了请各位大佬指正)
richard1122
2018-12-11 23:03:04 +08:00
这种场景下也可以考虑用 AsyncTask 做,封装好了临时用一下也容易。

https://developer.android.com/reference/android/os/AsyncTask
MoHen9
2018-12-11 23:23:29 +08:00
搜索 okhttp+ retrofit+ rxjava2,网上一堆教程,使用起来非常爽,不用写回调,对 Java 的熟悉程度相对有点要求。
winterbells
2018-12-11 23:28:58 +08:00
rxjava
merpyzf
2018-12-11 23:34:27 +08:00
@xbigfat 在子线程中做请求结果的回调,最终被调用的方法不是仍然执行在子线程的么?所以如果需要更新 ui 还是需要切换线程的吧。
merpyzf
2018-12-11 23:43:21 +08:00
@xbigfat 不太清楚答主所说的喜欢使用“ HttpUrlConnection + Thread + 手写 interface 做回调"的原因在哪儿?和使用 Handler 一样如果没有通过静态内部类的方式创建 Thread 对象,其内部仍然会持有外部类的引用啊!如果线程所处的 activity 被关闭,而线程却没有执行完毕,这个时候仍然会出现内存泄露的问题啊!
xbigfat
2018-12-12 08:00:01 +08:00
@merpyzf 呃,好像确实是这个问题。我再寻思寻思
nestorm001
2018-12-12 08:42:15 +08:00
建议看看 SDK 里 Handler、Looper、Message 和 MessageQueue 的源码
glaucus
2018-12-12 10:57:01 +08:00
Retrofit,回调方法自动切到主线程

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516662

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX