如何让应用程序等到线程执行完毕?

时间:2015-02-03 14:23:40

标签: java android multithreading android-fragments

在我的应用程序中,我必须在活动开始时将一个帐户列表从一个片段发送到另一个片段。我在以下线程中获取了帐户列表,将其保存在全局ArrayList中。如果对服务器的请求是好的,则ArrayList将填充必要的信息。然后,我在通过bundle将数据从一个片段传输到另一个片段之前调用loadAccounts方法。问题是线程在我想要在片段之间发送数据之前没有完成它的执行,因此在发送数据时ArrayList将为NULL。 如何让应用程序等到线程执行,然后才将数据发送到另一个片段?

我的主题看起来像这样:

public void loadAccounts() {

LoadAccounts loadAccountsThread = new LoadAccounts(new Handler() {

    public void handleResult(Result result) {
        switch (result) {
            case SUCCESSFUL_CODE:
                accountsList = (ArrayList<Account>) accounts;
                break;
            case FAILED_CODE:
                errorMsg = error.toString();
                showDialog(errorMsg);
            default:
                break;
        }
    }
});
loadAccountsThread.start();

}

在onCreate方法中我这样做:

loadAccounts();
                Bundle args = new Bundle();
                AccountsFragment fragment = new AccountsFragment ();
                args.putSerializable("accounts", accountsList.get(0));
                fragment.setArguments(args);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.rightConent, fragment).commit();

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

您不希望让应用程序等待,因为它会使您的应用程序变慢或甚至在发生错误时卡住。

不要通过捆绑包发送您的帐户。而是在AccountsFragment

中创建一个方法
public void setAccounts(ArrayList<Account> accounts){
    //do whatever you need with your accounts here
}

然后在你有一个SUCCESSFUL_CODE的handleResult方法里面,运行

fragment.setAccounts((ArrayList<Account>) accounts);

当然要这样做,请确保您的AccountFragment片段是一个字段,而不是onCreate中的局部变量。确保在运行线程之前实例化Fragment

答案 1 :(得分:0)

如果您正在调用Web服务,请使用AsyncTask而不是线程,并将其放在方法

Bundle args = new Bundle();
            AccountsFragment fragment = new AccountsFragment ();
                args.putSerializable("accounts", accountsList.get(0));
                fragment.setArguments(args);
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.rightConent, fragment).commit(); 

并使用上下文

onPostExecute()方法调用该方法