我创建了一个RecyclerView
,它显示了一个项目列表,每个项目旁边都有Checkbox
。
用户通过选中项目旁边的复选框来选择项目,然后最后单击"确定"按钮。
当用户单击"确定"时,我需要获取有关此项目的一些信息。但是,有两种类型的项目:Type A and Type B
。
对于类型A,我只需要为我的应用程序获取一些数据,而对于类型B,我需要执行asynctask
来获取数据。
我的目标是,一旦我完成了从所有项目中获取所有数据,就显示一条消息。
我的问题是,例如,如果用户同时选择了类型A和类型B,那么异步任务可能还没有完成,因此我将只从类型A项目中获取数据。
我的代码如下:
public void getitemNames(List<Discoveritems> items, long dateInMillis) {
itemNames = "";
onlyUploaded = true;
isDone = false;
for (int i = 0; i < items.size(); i++) {
String itemID = items.get( i ).getitemID();
if (itemID.length() > AppConstants.UPLOADED_item_LENGTH){
DocumentReference docRef = db.collection( "items" ).document( itemID );
docRef.get().addOnCompleteListener( new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
List<String> itemTitleWords = (List<String>) document.get( "itemTitle" );
String itemTitle = TextUtils.join( " ", itemTitleWords );
itemNames = itemNames + itemTitle + "n";
}
}
}
} );
} else {
onlyUploaded = false;
MyitemClient client = new MyitemClient();
client.getitems( itemID, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
if (response != null) {
final Myitem items = Myitem.fromJson( response );
itemNames = itemNames + items.getTitle() + "n";
}
}
@Override
public void onFinish() {
isDone = true;
}
} );
}
}
if (onlyUploaded) {
String TimeFormat = "dd.MM.yyyy";
SimpleDateFormat df2 = new SimpleDateFormat( TimeFormat );
String dateText = df2.format( dateInMillis );
db = FirebaseFirestore.getInstance();
CollectionReference usernamedb = db.collection( "Users" ).document( auth.getUid() ).collection( "UserData" );
usernamedb.get().addOnCompleteListener( task -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
String NewMessage = document.getString( "username" ) + " wants to share these items with you: nn" + itemNames + "nUntil " + dateText + "nnDo you confirm?";
chatOrganizer.addMessageToChat( chatID, auth.getUid(), receiverID, NewMessage, true );
}
}
} );
} else {
if (isDone){
String TimeFormat = "dd.MM.yyyy";
SimpleDateFormat df2 = new SimpleDateFormat( TimeFormat );
String dateText = df2.format( dateInMillis );
db = FirebaseFirestore.getInstance();
CollectionReference usernamedb = db.collection( "Users" ).document( auth.getUid() ).collection( "UserData" );
usernamedb.get().addOnCompleteListener( task -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
String NewMessage = document.getString( "username" ) + " wants to share these items with you: nn" + itemNames + "nUntil " + dateText + "nnDo you confirm?";
chatOrganizer.addMessageToChat( chatID, auth.getUid(), receiverID, NewMessage, true );
}
}
} );
}
}
}
如果选择了这两种类型,我如何确保它将等到最后一个asynctask
(如果完成(,然后才触发消息?
我想也许可以暂停这个过程,直到完成,但不知道怎么做。
谢谢
听起来你需要一个异步任务的回调。您可以让回调显示消息。
SO的回答可能会有所帮助:https://stackoverflow.com/a/37147021/11774624