Java 在同一线程中将一个方法的输出传递给另一个方法

Java 在同一线程中将一个方法的输出传递给另一个方法,java,android,Java,Android,异步任务的doinBackround方法中有两种方法。 第一种方法用于从云数据库检索值。 中的第二种方法用于在msqlite中保存值 我的问题是,当执行第二个方法时,第一个方法无法在需要时生成值,因此传递null。请看一下代码片段 @Override protected Void doInBackground(Param... params) { try { List<Object> objectlist = mAsyn

异步任务的doinBackround方法中有两种方法。
第一种方法用于从云数据库检索值。 中的第二种方法用于在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
@覆盖
受保护的Void doInBackground(参数…参数){
试一试{
List objectlist=mAsyncTaskFireDB.getobjectlist(参数[0]);
//要传递到第二个方法的此方法的输出。
Object[]listarray=新对象[objectlist.size()];
对于(整数i=0;i您应该使用
这将使您等待任务完成。
请注意,如果您在那里使用它,它将冻结您的UI线程。

您可以查看API

您可以使用
runAsync
thenApplyAsync
等方法,轻松处理需要异步运行的任务,也可以让它们一个接一个地运行,将上一步的结果用于下一步。使用
异常
,也可以仅在上一个任务以例外


这是一个很棒的API,如果您主要使用并发,它非常有用。

看起来您可以从主线程访问
获取聊天信息,因为它是基于侦听器的,所以在保存数据时,您只需要在主线程之外的其他线程中执行该部分。请尝试下面的方法

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);
    }
}
mAsyncTaskFireDB.get_chat_message(参数[0],新的onchatmsgreeadfstoredb(){
@凌驾
公共列表onMsgreadCompleteFstoredB(列出聊天信息){
Chat_messages[]msgarray=新的Chat_messages[Chat_messages.size()];

对于(整数i=0;ii如果我理解正确,我认为您必须在AsyncTask的onPostExecute方法内的第二个方法中执行您想要执行的操作,并且您可以使用此答案将数据从doInBackground传递到onPostExecute Thanx以供您响应……不,因为第二个方法将数据写入Mysqlite,所以必须在doInBackground中完成only而非onPostExecute方法。您是否从doInBackground调用第二个方法?是的,您的建议是正确的,但如果我没有弄错的话,这需要API 24及以上。我的最低API是14,因此可能无法工作。此外,现在只希望将数据从云传输到Sqlite,没有更复杂的内容。我的理解是llback可能是正确的选项,但放置接口类时会让我感到困扰,因为当作为单独的类放置时,会给我一个错误,“无法访问主线程上的数据库,因为它可能会长时间锁定UI。”在新的DBTask(msgarray)中出现错误“无法解析DBTask”。execute()还有一件事不清楚,如果我们在后台做,为什么会出错"无法访问主线程上的数据库,因为它可能会长时间锁定UI。还尝试将对象mCat_messageDao传递到save_chat_message方法中,但出现相同的错误。我们是否可以通过序列化的方式序列化这两个方法?Thanx因为您的helpDBTask是一个内部类,它不应该给出任何投诉。还有一段很短的代码,很难理解您在自定义类中做了什么。它最终起了作用,只是将位置更改为内部类的上侧。谢谢您的支持。我只是尝试从Firestore检索数据,并通过异步方式将其保存在Sqlite中。您有没有更好的解决方案来使用m部署它复杂性最小?再次感谢您提供的所有支持given@SukeshSaxena理想情况下,您不需要在本地保存数据,因为Firstore已经提供了脱机支持
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);
    }
}