0

Извлечение данных из сети не может быть выполнено в потоке пользовательского интерфейса в Android. Я пытаюсь обойти это как так ...Вводящий поток с неправильным подсчетом

for(i=0;i<list.size();i++){ 

    //add a UI element 

    new Thread(new Runnable(){ 
     public void run(){ 
      //retrieve online content 
     } 
    }).start(); 
    LinearLayout.addView(MyView); 

}

Аналогичный пример в android docs

та часть внутри нити доступов список с Получ() , когда «i» должно быть 0, чтобы получить первый элемент в списке «i» на самом деле 1 и вызывает исключение OutOfBoundsException, если есть только один элемент. Я собираюсь догадаться, что у меня проблема с нитью safty здесь. Есть ли простой способ исправить эту проблему?

ответ

2

Прочтите это http://developer.android.com/reference/android/os/AsyncTask.html, чтобы использовать AsyncTask для выполнения задач в фоновом режиме вместо Threads.

AsyncTasks обеспечивает хорошую обертку для выполнения фоновой задачи и postExecute задачи (непосредственно на UI потоке) и т.д.

EDIT: также от вашего кода я не уверены, что правильно будет так ... Похоже, что вы работаете нить для каждого элемента в вашем list.

и

LinearLayout.addView(MyView); 

действительно зависит от задачи, которую выполняют в фоновом режиме? Если да, сделайте это один раз после того, как вы извлекли все данные из сети (и внутри потока), потому что тогда вы узнаете, что эта задача выполнена. если нет, то нет причин, чтобы поставить его здесь ..

вместо этого вы должны запустить один поток (лучше асинхронной задачи), чтобы извлечь из сети, и показать/обновить пользовательский интерфейс, когда поток/задача закончена ...

+0

асинхронная задача отлично поработала – Jack

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