(100分,解决立马结贴)方法中 如何等待子线程结束后在返回结果??? (十万火急)

Android 码拜 6年前 (2015-05-10) 420次浏览 0个评论
 

我的方法需要返回一段从网络中获取的数据,方法在主线程中执行。

但是访问网络必须在子线程中操作, 新启一个子线程,start(), 等线程执行完毕通过sendMessage()告诉Handler对象,然后通过Handler的handleMessage()获取到子线程返回的数据,      但是handleMessage()方法是void类型的啊  ,  handleMessage()里面虽然获取到返回结果了,  但我的方法怎么才能返回呢?     

开启子线程和Handler变量都在我的方法中,  我的方法需要拿到子线程中的数据,然后返回给别人,  我该怎么做啊?

30分
定义全局变量不就可以了么,,,
30分
楼主没有明白为何访问网络的操作会要求在线程中执行吗?这是为了防止界面无响应严重影响用户体验.
这个问题正常的解决办法是在具体的页面中新建 Handler , 然后在线程中取得数据后直接 sendMessage.
如果一定要使用现有的方法,那得改造一下,增加一个参数,这个参数是一个接口,通过接口回传数据.
30分

访问网络放到子线程中就是为了避免ui受影响,如果按lz的思路,非要得到一个什么返回值,还不如直接在主线程访问网络。

解除主线程网络访问限制

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
2分
网络请求完可以发Message出去,Message里可以带Bundle数据,你可以在这Bundle中存放一些数据,在handleMessage里,可以获取到Message里的Bundle数据
2分
既然已经是异步处理了,我倒是觉得 你可以通过observer模式把结果给返回了,而不是通过函数返回值。
2分
handleMessage这个Message就是携带信息的啊,本身这个用法就避免了自建回调函数这种麻烦一点的做法。
简单的话Message.what 和 Message.object都可以,还可以按楼上说的放bundle(Message.setData(Bundle bundle)),handleMessage的时候把这些个信息拿出来做你要做的
2分
同意LS ,用Bundle  对象。
2分
把 Handler 定义在 Activity 全局变量;

定义一个全局变量 A , 初始值设置为 -1 或者 null, 当 Handler 中获取到了这个数据, 直接给全局变量赋值 ; 

在方法中, 你线程执行完毕之后 设置一个 while 无线循环 , 条件是 你设置的全局变量 A 不等与 你的初始值, 然后 把 A 返回;

如果 A 需要重复使用, 你在方法中设置一个临时变量, 将 A 赋值给临时变量, 然后将 A 设置为初值, 返回临时变量; 

1楼和4楼的方法都可以呀,干嘛一定要在方法中有返回值的方式
建议定义个静态的全局变量
如果这个返回值有多处使用的话就定义一个全局变量接收就行了,如果只有一处使用,可以用message传到handler里面处理,,你这个函数可以不用返回值
初到公司,遇到一个自以为是的菜鸟,和 一无所知的主管,   

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明(100分,解决立马结贴)方法中 如何等待子线程结束后在返回结果??? (十万火急)
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!