在应用程序完成获取并将获取的数据传递给它之后,我应该如何启动一个新的 Activity?

How should I start a new Activity, after the application is done fetching and passing the fetched data to it?

在我的应用程序中,我使用联系人数据库并使用 RecyclerView 显示这些联系人。当我点击一个联系人时,我想从数据库中的表中获取它的数据,并将它们加载到一个新的 Activity、ContactCard 中。我有一个 AsyncTask(),它获取与所选 contactId 匹配的 PhoneNumber 对象,但我还需要从其他表中检索 AddressEmail 对象。

我希望能够在获取所有相关数据后启动 activity,我尝试在 activity 中使用联系人 RecyclerView 执行此操作,但是由于尚未获取数据,应用程序崩溃。

我可以使用意图调用新的 activity,但是如何确保在启动新的 activity(有效显示此数据)之前首先从不同的表中获取数据?

我的一些代码:

public class PhoneNumberRepository {

    private WorksideDatabase worksideDatabase;
    private List<PhoneNumber> returnedNumbers;
    private Context mContext;

    public PhoneNumberRepository(Context context) {
        String DB_NAME = "workside_database";
        worksideDatabase = Room.databaseBuilder(context, WorksideDatabase.class, DB_NAME).build();
        mContext = context;
    }

    public List<PhoneNumber> fetchPhoneNumbers(final int id) {

        new AsyncTask<Integer, Void, List<PhoneNumber>>() {
            @Override
            protected List<PhoneNumber> doInBackground(Integer... ids) {

                returnedNumbers = worksideDatabase.phoneNumberDao().getPhoneNumbersById(id);

                System.out.println(returnedNumbers);

                for (PhoneNumber pn : returnedNumbers) {
                    System.out.println("Number: " + pn.getPhoneNumber());
                }

                return returnedNumbers;
            }

            // This runs in UI when background thread finishes
            @Override
            protected void onPostExecute(List<PhoneNumber> result) {
                super.onPostExecute(result);

                System.out.println("Entered onPostExecute of fetchPhoneNumbers");

                //                for (PhoneNumber pn : result) {
                //                    Toast.makeText(mContext, pn + "", Toast.LENGTH_SHORT).show();
                //                }
            }
        }.execute();

        return returnedNumbers;
    }

    public List<PhoneNumber> getPhoneNumbers(int id) {
        return fetchPhoneNumbers(id);
    }
}

联系人片段:

     adapter.setOnItemClickListener(
                contact -> {
     Intent viewContact = new Intent(getActivity(), WorksideContactCard.class);
     viewContact.putExtra(WORKSIDE_CONTACT, contact);

     PhoneNumberRepository phoneNumberRepository =
         new PhoneNumberRepository(getActivity().getApplicationContext());

     List<PhoneNumber> phoneNumberList;

     phoneNumberList = phoneNumberRepository.getPhoneNumbers(contact.getId());

     ArrayList<PhoneNumber> arrlistPhoneNumbers =
                                new ArrayList<>(phoneNumberList);
                        viewContact.putParcelableArrayListExtra(
                                WORKSIDE_CONTACT_PHONE_NO, arrlistPhoneNumbers);

      startActivity(viewContact);
}

doInBackground() 方法中将联系人存储在一个列表中,并在 activity 中启动新的意图onPostExecute() 方法并以此意图将联系人列表作为 intent.extra() 变量传递,检索并在称为 activity.

将您的存储库 class 更改为类似这样的内容

public class PhoneNumberRepository {

    private WorksideDatabase worksideDatabase;
    private List<PhoneNumber> returnedNumbers;
    private Context mContext;
    private boolean dataDownloaded;

    public PhoneNumberRepository(Context context) {
        String DB_NAME = "workside_database";
        worksideDatabase = Room.databaseBuilder(context, WorksideDatabase.class, DB_NAME).build();
        mContext = context;
    }

    public List<PhoneNumber> fetchPhoneNumbers(final int id) {

        new AsyncTask<Integer, Void, List<PhoneNumber>>() {
            @Override
            protected List<PhoneNumber> doInBackground(Integer... ids) {

                returnedNumbers = worksideDatabase.phoneNumberDao().getPhoneNumbersById(id);

                System.out.println(returnedNumbers);

                for (PhoneNumber pn : returnedNumbers) {
                    System.out.println("Number: " + pn.getPhoneNumber());
                }

                return returnedNumbers;
            }

            // This runs in UI when background thread finishes
            @Override
            protected void onPreExecute(List<PhoneNumber> result) {
                //set flag to false when download starts
               dataDownloaded = false;
            } 

            // This runs in UI when background thread finishes
            @Override
            protected void onPostExecute(Object obj) {
                super.onPostExecute(result);

                //set flag to true once download completes, you can also check if response is null and update it accordingly 
                dataDownloaded = true;

                System.out.println("Entered onPostExecute of fetchPhoneNumbers");

                //                for (PhoneNumber pn : result) {
                //                    Toast.makeText(mContext, pn + "", Toast.LENGTH_SHORT).show();
                //                }
            }
        }.execute();

        return returnedNumbers;
    }

    public List<PhoneNumber> getPhoneNumbers(int id) {
        return fetchPhoneNumbers(id);
    }

    public boolean isDataDownloaded(int id) {
        return dataDownloaded;
    }
}

无论您的数据是否下载

,都请在onItemClick()中使用此功能
if(phoneNumberRepository.isDataDownloaded()) {
   //code to fetch data from phonenumberrepo and start activity
}

您可以在单击某个项目时执行此操作,像这样启动异步任务

 adapter.setOnItemClickListener(
                contact -> {
     PhoneNumberRepository phoneNumberRepository =
     new PhoneNumberRepository(getActivity().getApplicationContext());

 List<PhoneNumber> phoneNumberList;

 phoneNumberRepository.getPhoneNumbers(contact.getId());

}

并将您的电话号码存储库更改为此class

public class PhoneNumberRepository {

        private WorksideDatabase worksideDatabase;
        private List<PhoneNumber> returnedNumbers;
        private Context mContext;

        public PhoneNumberRepository(Context context) {
            String DB_NAME = "workside_database";
            worksideDatabase = Room.databaseBuilder(context, WorksideDatabase.class, DB_NAME).build();
            mContext = context;
        }

        public void fetchPhoneNumbers(final int id) {

            new AsyncTask<Integer, Void, List<PhoneNumber>>() {
                @Override
                protected List<PhoneNumber> doInBackground(Integer... ids) {

                    returnedNumbers = worksideDatabase.phoneNumberDao().getPhoneNumbersById(id);

                    System.out.println(returnedNumbers);

                    for (PhoneNumber pn : returnedNumbers) {
                        System.out.println("Number: " + pn.getPhoneNumber());
                    }

                    return returnedNumbers;
                }

                // This runs in UI when background thread finishes
                @Override
                protected void onPostExecute(List<PhoneNumber> result) {
                    super.onPostExecute(result);
 Intent viewContact = new Intent(context, WorksideContactCard.class);
    ArrayList<PhoneNumber> arrlistPhoneNumbers =
                                new ArrayList<>(result);
                        viewContact.putParcelableArrayListExtra(
                                WORKSIDE_CONTACT_PHONE_NO, arrlistPhoneNumbers);

      context.startActivity(viewContact);
                    System.out.println("Entered onPostExecute of fetchPhoneNumbers");


                }
            }.execute();

        }

        public void getPhoneNumbers(int id) {
            return fetchPhoneNumbers(id);
        }
    }