请问如何等待异步API调用返回结果后再将结果返回给主进程?

============问题描述============

代码如下。

在主进程调用data.getData()后希望返回从API取得data,但是现在由于异步的关系resultSFSearchDataJSONParser直到主进程完全结束后才返回值,这样在getData()那里根本取不到data。

请问如何才能让getData()等待resultSFSearchDataJSONParser返回值以后自己才返回给主进程?

个人对handler多线程之类不太熟悉,能给我个简单的例子最好,谢谢啦。

class data

{

...

//取得数据

public Data getData(key) {

Data data = new Data();

params.put("word", key);

// 调用API取得数据

new DataLoader(){

@Override

public void resultSFSearchDataJSONParser(

SFSearchCountJSONParser sfSearchCountJSONParser, boolean isSuccess) {

// TODO Auto-generated method stub

super.resultSFSearchDataJSONParser(sfSearchCountJSONParser,isSuccess);

data = (Data)sfSearchCountJSONParser.result.get(0);

}

}.getData(this.key);

return data;

}

}

// API取得数据

class DataLoader implements SFSearchJSONParserDelegate {

Data data = new Data();

private SFSearchCountJSONParser searchJSONParser = null;

private HashMap<String, String> params = new HashMap<String, String>();

public void getData(String key) {

params.put("word", key);

searchJSONParser = new SFSearchCountJSONParser();

searchJSONParser.parserDelegate = this;

searchJSONParser.executeStockSearchCountByParams(params);

}

// 结果返回函数

@Override

public void resultSFSearchDataJSONParser(

SFSearchCountJSONParser sfSearchCountJSONParser, boolean isSuccess) {

// TODO Auto-generated method stub

data = (Data)sfSearchCountJSONParser.result.get(0);

}

}

============解决方案1============

你可以看看我在这个帖子里的回答,我在那里举例说明了怎么样用AsyncTask来把结果返回给UI线程。

时间: 2024-10-26 20:03:44

请问如何等待异步API调用返回结果后再将结果返回给主进程?的相关文章

java并发编程学习:如何等待多个线程执行完成后再继续后续处理(FutureTask、synchronized、CyclicBarrier)

多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的static变量,假如有10个线程,每个线程处理完上去累加下结果,然后后面用一个死循环(或类似线程阻塞的方法),去数这个结果,达到10个,说明大家都爽完了,可以进行后续的事情了,这个想法虽然土鳖,但是基本上跟语言无关,几乎所有主流编程语言都支持. package yjmyzz.test; publi

ios7自定义返回按钮后,右滑返回功能失效解决方法

-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; //开启ios右滑返回 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.delegate = n

Redis源码解析:19Hiredis异步API代码解析

Hiredis中的异步API函数需要与事件库(libevent,libev, ev)一起工作.因为事件循环的机制,异步环境中的命令是自动管道化的.因为命令是异步发送的,因此发送命令时,必要情况下,需要提供一个回调函数,以便在收到命令回复时调用该函数. 异步API涉及到的函数分别是: redisAsyncContext *redisAsyncConnect(const char *ip, int port); int redisAsyncCommand(redisAsyncContext *ac,

方法功能描述:从str1中删除所有的str2,并返回删除后的结果,返回结果为Object[]数组

/** * 定义一个方法 * public Object[] deleteSubString(String str1,String str2){ * * } * 方法功能描述:从str1中删除所有的str2,并返回删除后的结果,返回结果为object[]数组 * 该数组的第一个元素删除所有的str2后的最终的字符串 * 该数组的第二个元素为删除的str2的个数 * */public class Test06 { public static void main(String[] args) { S

基于Hiredis异步API的聊天系统实现

基于Hiredis异步API的聊天系统实现 上一篇文章http://blog.csdn.net/qq_34788352/article/details/51313027使用Hiredis的同步API实现了发送消息的客户端,当我使用同步API实现订阅频道客户端时,一旦订阅频道,就会出现无法操作的情况,这是就是同步和异步的问题.使用同步API,订阅频道后,客户端会进入阻塞状态,等待订阅频道发布的消息,不能实现既订阅频道,又能发布消息的功能.为了实现一个客户端既能订阅频道,又能发布消息的功能,就需要使

通过异步程序调用(APC)实现的定时功能

定时器是一个在特定时间或者规则间隔被激发的内核对象.结合定时器的异步程序调用可以允许回调函数在任何定时器被激发的时候执行.本文的例子代码显示了如何实现. 使用本定时器时,你需要把常量_WIN32_WINNT定义为0x0400,并且此常量应该在包之前定义,以确保声明合适的定时器原型函数. 通过调用CreateWaitableTimer()可以创建一个定时器,此函数返回一个指向内核对象的句柄.若定时器已经存在,你可以通过使用 OpenWaitableTimer()获得一个进程相关的句柄.无论是通过C

linux下使用hiredis异步API实现sub/pub消息订阅和发布的功能

最近使用redis的c接口--hiredis,使客户端与redis服务器通信,实现消息订阅和发布(PUB/SUB)的功能,我把遇到的一些问题和解决方法列出来供大家学习. 废话不多说,先贴代码. redis_publisher.h /************************************************************************* > File Name: redis_publisher.h > Author: chenzengba > Ma

C#多线程编程之:异步事件调用

当一个事件被触发时,订阅该事件的方法将在触发该事件的线程中执行.也就是说,订阅该事件的方法在触发事件的线程中同步执行.由此,存在一个问 题:如果订阅事件的方法执行时间很长,触发事件的线程被阻塞,长时间等待方法执行完毕.这样,不仅影响后续订阅事件方法的执行,也影响主线程及时响应用户 的其他请求.如何处理这个问题呢?讲到此,我想您已经想到了,那就是异步事件调用. 怎样实现异步事件调用呢?如果您对事件比较了解的话,您应该知道事件的本质其实是一种MulticastDelegate(多播委托). Mult

前后分离模型之封装 Api 调用

Ajax 和异步处理 调用 API 访问数据采用的 Ajax 方式,这是一个异步过程,异步过程最基本的处理方式是事件或回调,其实这两种处理方式实现原理差不多,都需要在调用异步过程的时候传入一个在异步过程结束的时候调用的接口.比如 jQuery Ajax 的 success 就是典型的回调参数.不过使用 jQuery 处理异步推荐使用 Promise 处理方式. Promise 处理方式也是通过注册回调函数来完成的.jQuery 的 Promise 和 ES6 的标准 Promise 有点不一样,