gpt4 book ai didi

java - Android如何像在iOS中一样将异步任务分组在一起

转载 作者:IT老高 更新时间:2023-10-28 20:27:45 27 4
gpt4 key购买 nike

我在 iOS 应用中有一个函数,它使用 dispatch_group 对多个休息请求进行分组:

static func fetchCommentsAndTheirReplies(articleId: String, failure: ((NSError)->Void)?, success: (comments: [[String: AnyObject]], replies: [[[String: AnyObject]]], userIds: Set<String>)->Void) {
var retComments = [[String: AnyObject]]()
var retReplies = [[[String: AnyObject]]]()
var retUserIds = Set<String>()

let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
Alamofire.request(.GET, API.baseUrl + API.article.listCreateComment, parameters: [API.article.articleId: articleId]).responseJSON {
response in

dispatch_async(queue) {

guard let comments = response.result.value as? [[String: AnyObject]] else {
failure?(Helper.error())
return
}
print(comments)
retComments = comments

let group = dispatch_group_create()

for (commentIndex, comment) in comments.enumerate() {
guard let id = comment["_id"] as? String else {continue}

let relevantUserIds = helperParseRelaventUserIdsFromEntity(comment)
for userId in relevantUserIds {
retUserIds.insert(userId)
}

retReplies.append([[String: AnyObject]]())

dispatch_group_enter(group)
Alamofire.request(.GET, API.baseUrl + API.article.listCreateReply, parameters: [API.article.commentId: id]).responseJSON {
response in

dispatch_async(queue) {
if let replies = response.result.value as? [[String: AnyObject]] {
for (_, reply) in replies.enumerate() {

let relevantUserIds = helperParseRelaventUserIdsFromEntity(reply)
for userId in relevantUserIds {
retUserIds.insert(userId)
}
}
retReplies[commentIndex] = replies
}
dispatch_group_leave(group)
}

}
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
success(comments: retComments, replies: retReplies, userIds: retUserIds)

}

}
}

从我的代码中可以看出,我获取了同一个article下的所有comments,然后获取每个下对应的replies >评论。在所有请求完成后,我调用我的 success 回调。这可以使用 GCD 的 dispatch_group 来实现。

现在我正在将相同的功能迁移到 android。

public static void fetchCommentsAndTheirReplies(Context context, String articleId, final StringBuffer outErrorMessage, final Runnable failure, final ArrayList<JSONObject> outComments, final ArrayList<ArrayList<JSONObject>> outReplies, final HashSet<String> outUserIds, final Runnable success) {
final RequestQueue queue = Volley.newRequestQueue(context);
HashMap<String, String> commentParams = new HashMap<>();
commentParams.put(API.article.articleId, articleId);
JsonArrayRequest commentRequest = new JsonArrayRequest(Request.Method.GET, API.baseUrl + API.article.listCreateComment, new JSONObject(commentParams), new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
JSONObject comment = response.getJSONObject(i);
outComments.add(comment);

outUserIds.addAll(helperParseRelaventUserIdsFromEntity(comment));
outReplies.add(new ArrayList<JSONObject>());

//TODO: DISPATCH_GROUP?
String id = comment.getString("_id");
HashMap<String, String> replyParams = new HashMap<>();
replyParams.put(API.article.commentId, id);
final int finalI = i;
JsonArrayRequest replyRequest = new JsonArrayRequest(Request.Method.GET, API.baseUrl + API.article.listCreateReply, new JSONObject(replyParams), new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
for (int j = 0; j < response.length(); j++) {
JSONObject reply = response.getJSONObject(j);
outUserIds.addAll(helperParseRelaventUserIdsFromEntity(reply));
outReplies.get(finalI).add(reply);
}
} catch (JSONException ex) {}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {}
});
queue.add(replyRequest);
}
success.run();

} catch (JSONException ex) {}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
outErrorMessage.append(error.getMessage());
failure.run();
}
});
queue.add(commentRequest);
}

请注意,我使用的 success 是在我获得所有 comments 之后和获得所有 replies 之前执行的。

那么我怎样才能对它们进行分组并延迟响应呢?

我正在研究毛茸茸的实现,比如

taskCount++;
if (taskCount == totalCount) {
success.run();
}

在回复 block 中,但是看起来很乏味。

最佳答案

您可以简单地使用我为模仿 iOS 行为而制作的此类。调用 enter() 和 leave() 的方式与在 iOS 中使用 dispatch_group_enter 和 dispatch_group_leave 的方式相同,并在要分组的请求之后调用 notify(),就像 dispatch_group_notify 一样。它也像 iOS 使用 block 一样使用 runnable:

public class DispatchGroup {

private int count = 0;
private Runnable runnable;

public DispatchGroup()
{
super();
count = 0;
}

public synchronized void enter(){
count++;
}

public synchronized void leave(){
count--;
notifyGroup();
}

public void notify(Runnable r) {
runnable = r;
notifyGroup();
}

private void notifyGroup(){
if (count <=0 && runnable!=null) {
runnable.run();
}
}
}

希望对你有帮助;)

关于java - Android如何像在iOS中一样将异步任务分组在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34871580/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com