V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuanxx9608
V2EX  ›  Android

安卓中子线程传值的问题

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

    https://developer.android.com/reference/android/os/AsyncTask
    MoHen9
        5
    MoHen9  
       2018-12-11 23:23:29 +08:00 via Android
    搜索 okhttp+ retrofit+ rxjava2,网上一堆教程,使用起来非常爽,不用写回调,对 Java 的熟悉程度相对有点要求。
    winterbells
        6
    winterbells  
       2018-12-11 23:28:58 +08:00 via Android
    rxjava
    merpyzf
        7
    merpyzf  
       2018-12-11 23:34:27 +08:00 via Android
    @xbigfat 在子线程中做请求结果的回调,最终被调用的方法不是仍然执行在子线程的么?所以如果需要更新 ui 还是需要切换线程的吧。
    merpyzf
        8
    merpyzf  
       2018-12-11 23:43:21 +08:00 via Android
    @xbigfat 不太清楚答主所说的喜欢使用“ HttpUrlConnection + Thread + 手写 interface 做回调"的原因在哪儿?和使用 Handler 一样如果没有通过静态内部类的方式创建 Thread 对象,其内部仍然会持有外部类的引用啊!如果线程所处的 activity 被关闭,而线程却没有执行完毕,这个时候仍然会出现内存泄露的问题啊!
    xbigfat
        9
    xbigfat  
       2018-12-12 08:00:01 +08:00 via iPhone
    @merpyzf 呃,好像确实是这个问题。我再寻思寻思
    nestorm001
        10
    nestorm001  
       2018-12-12 08:42:15 +08:00
    建议看看 SDK 里 Handler、Looper、Message 和 MessageQueue 的源码
    glaucus
        11
    glaucus  
       2018-12-12 10:57:01 +08:00
    Retrofit,回调方法自动切到主线程
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1192 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 23:10 · PVG 07:10 · LAX 15:10 · JFK 18:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.