2015-02-03 3 views
0

В моем приложении мне нужно отправить список учетных записей из одного фрагмента другому, когда начнется действие. Я получаю список учетных записей в следующем потоке, сохраняя его в глобальном ArrayList. Если запрос на сервер хорош, ArrayList заполняется необходимой информацией. Затем я вызываю метод 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(); 

Любая помощь будет оценена. Благодарю.

+0

»Как заставить приложение ждать, пока поток выполнит?« - Темы, как правило, имеют метод «join». – theV0ID

+0

Проверьте эту тему, я думаю, она содержит всю необходимую информацию. http://stackoverflow.com/questions/861346/in-java-how-do-you-determine-if-a-thread-is-running – SomeJavaGuy

+1

Рассматривали ли вы использование 'Queue' или еще лучше' BlockingQueue '? – OldCurmudgeon

ответ

1

Вы не хотите, чтобы ваше приложение ждало, потому что оно сделает ваше приложение медленным или даже застрявшим в случае ошибки.

Не отправляйте свои счета через комплект. Вместо того, чтобы создать метод внутри AccountsFragment

public void setAccounts(ArrayList<Account> accounts){ 
    //do whatever you need with your accounts here 
} 

, а затем внутри вашего метода handleResult, когда у вас есть SUCCESSFUL_CODE, запустить

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

, конечно, чтобы сделать это, убедитесь, что ваш фрагмент AccountFragment является полем и не локальная переменная внутри вашего onCreate. Убедитесь также, что вы создать экземпляр фрагмента перед запуском нитки

0

Если вы звоните использование службы веб-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() метода с использованием контекста

Смежные вопросы