我的Asynch任务的doinBackround方法中有两种方法。
第一种方法用于从Cloud Database检索值。
第二种方法用于在msqlite中保存值。
我的问题是当第二种方法执行时,第一种方法无法在需要时产生值,因此传递了null。请查看代码段。
@Override
protected Void doInBackground(Param... params) {
try {
List<Object> objectlist = mAsyncTaskFireDB.getobjectlist(params[0]);
// Output of this method to be passed into 2nd method.
Object[] listarray = new Object[objectlist.size()];
for(Integer i=0;i<objectlist.size();i++)
{
listarray[i] = objectlist.get(i);
}
mCat_messageDao.insertAll(listarray);
// 2nd method : Value of 1st method should come here however
getting null here
已通过Google搜索并找到正确的解决方案。我想知道什么是处理这种常见情况的最佳方法。提前感谢您的帮助。
编辑
Asynch Class Code below
private static class insertAsyncTaskFireDB extends AsyncTask<Chat_Message,Void, Void> {
private Firestore_dB mAsyncTaskFireDB;
private Chat_MessageDao mCat_messageDao;
private OnChatMsgreadFStoredB onChatMsglistner;
insertAsyncTaskFireDB(Firestore_dB dB,Chat_MessageDao mChat_messageDao,OnChatMsgreadFStoredB calback) {
mAsyncTaskFireDB = dB;
mCat_messageDao = mChat_messageDao;
onChatMsglistner = calback;
}
@Override
protected Void doInBackground(final Chat_Message... params) {
if(params[0].groupID == null)
{
params[0].setGroupID(mAsyncTaskFireDB.getChatMsgforSingleGrp(params[0].tempgrpID));
}
else {
try {
mAsyncTaskFireDB.get_chat_message(params[0], new OnChatMsgreadFStoredB() {
@Override
public List<Chat_Message> onMsgreadCompleteFstoredB(List<Chat_Message> chat_messages) {
Chat_Message[] msgarray = new Chat_Message[chat_messages.size()];
for(Integer i=0;i<chat_messages.size();i++)
{
msgarray[i] = chat_messages.get(i);
}
mCat_messageDao.insertAll(msgarray);
return null;
}
});
}
catch(Error e){Log.d(TAG, "Error is Asynch Class fetcing details from Sqlite"+e);}
}
return null;
}
}
答案 0 :(得分:1)
由于基于监听器,您似乎可以从主线程访问get_chat_message
,因此在保存数据时,您只需要在主线程中执行该部分即可。请尝试以下
mAsyncTaskFireDB.get_chat_message(params[0], new OnChatMsgreadFStoredB() {
@Override
public List<Chat_Message> onMsgreadCompleteFstoredB(List<Chat_Message> chat_messages) {
Chat_Message[] msgarray = new Chat_Message[chat_messages.size()];
for(Integer i=0;i<chat_messages.size();i++)
{
msgarray[i] = chat_messages.get(i);
}
new DBTask(msgarray).execute();
return null;
}
});
class DBTask extends AsyncTask<Void,Void, Void> {
Chat_Message[] msgarray;
public DBTask(Chat_Message[] data){
msgarray = data;
}
@Override
protected Void doInBackground(Void ...voids) {
mCat_messageDao.insertAll(msgarray);
}
}
答案 1 :(得分:0)
您应该使用AsyncTask.get() 这将使您等到任务完成。 请注意,如果在那里使用它,它将冻结您的UI线程。
答案 2 :(得分:0)
您可以看一下CompletableFuture API。
使用runAsync
和thenApplyAsync
之类的方法,您可以轻松地处理需要异步运行的任务,也可以让它们一个接一个地运行,使用上一步到下一步的结果。使用exceptionally
,还可以仅在上一个任务以异常结束的情况下运行指定的任务。
如果您主要使用并发性,那么它是一个很棒的API,并且非常有用。