我试图弄清楚如何处理从异步任务
返回的数据。
我有一个活动,我正在调用异步Firebase get操作(存在于其他类中的操作),并且我想使用检索到的ArrayList的大小更新活动中存在的TextView
。以下是我在活动创建中获取的 Firebase 调用:
public void getAttendants() {
ArrayList<AttendModel> attendees = new ArrayList<AttendModel>();
FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees);
Log.d("attendees", String.valueOf(attendees.size()));
}
这是我的Firebase操作:
public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray) {
final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject);
Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID);
queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue();
String UUID = (String) attend.get(Constants.taAttendObjectUUID);
String userUsername = (String) attend.get(Constants.AttendObjectUserUsername);
AttendModel attendModel = new AttendModel(userUsername, UUID);
attendArray.add(attendModel);
//here would like to notify or somehow return the attendArray
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
在Android中,最好的方法是什么?是否有可能实现各种适配器或完成处理程序?
你正在寻找的是回调接口,至于你的需要,你需要一个简单的接口,实现单参数单方法,因为没有现成的Java 6 (Android Java版本)的约定,你可以很容易地自己创建它:
interface Callback {
void act(List<AttendModel> models);
}
将它作为参数传递给firebase包装方法,并用结果调用它。
public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray, final Callback callback) {
final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject);
Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID);
queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue();
String UUID = (String) attend.get(Constants.AttendObjectUUID);
String userUsername = (String) attend.get(Constants.AttendObjectUserUsername);
AttendModel attendModel = new AttendModel(userUsername, UUID);
attendArray.add(attendModel);
callback.act(attendArray)
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
然后在你的上层方法中:
public void getAttendants() {
ArrayList<AttendModel> attendees = new ArrayList<AttendModel>();
FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees,
new Callable<List<AttendModel) {
void act(List<AttendModel> attendees){
//here you can update the UI
Log.d("attendees", String.valueOf(attendees.size()));
}
};
}
请注意,只有在主线程上调用firebase查询的onDataChange方法时,才可以更新UI。
这里我有一个函数,它应该返回秒数作为变量sec,但是return语句在数据库事务之前运行,所以我一直没有定义。我可以做些什么来确保事务在回电话之前完成。类似于用于。
编辑:Redis+Sidekiq完成该工作。在这里,Redis作为一个消息队列工作,Sidekiq在后台处理这些消息。我很想知道,选择一个显式代理(如RabbitMQ、SQS、Redis PubSub)而不是Redis+SideKiQ有什么用例和好处?
接口说明 为上传完成的数据创建该数据的处理任务 API地址 POST /api/upload/1.0.0/createTask 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 title string form 否 标题 position string form 否 位置(例如:'120,30,0') description string form 否 描述 dataGuid
接口说明 修改指定的数据处理任务的状态 API地址 POST /api/upload/1.0.0/updateTask 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 title string form 否 标题 position string form 否 位置(例如:'120,30,0') description string form 否 描述 dataGuid str
我一直在使用异步任务来访问web服务器,并使用结果更新控件。这有缺点,即它使异步方法特定于控件,并阻止我再次使用返回的字符串。 我的典型asyncTask代码如下
我对如何从这个网站将大量模板JSON数据加载到我的应用程序中而不减慢主UI线程感到非常陌生和困惑。我可以将要从JSON响应加载的数据加载到我的recycler视图中,但单击底部显示该数据的导航选项卡需要很长时间才能加载到页面上。 我明白这是因为数据没有正确加载到后台线程,这就是我感到困惑的地方。 我希望能够从后台任务返回一个ArrayList,并将填充的ArrayList作为我的recyclerv