не могу определить адаптер в потоке

я не копирую весь код, потому что он слишком длинный, но чтобы быть кратким:

У меня есть функция (recup_list_internet), в которой есть поток, который извлекает данные из Интернета (XML), декодирует их и назначает каждый «узел» элементу в моем адаптере.

При выполнении декодирования вне потока все работает нормально. Поэтому я модифицирую это для использования внутри потока, создаю в нем функцию void run(), отображающую мой progressDialog, декодирование, данные хорошо извлекаются, хорошо назначаются моей карте (= new HashMap();), и вот где появляется проблема

private void recup_list_internet()
{
final ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
final Context mContext=this.getBaseContext();


Thread t = new Thread()
{
    public void run()
    {/* the code here works fine, not displaying it to be more concise*/

    progressDialog.dismiss(); //works fine
    SimpleAdapter mSchedule = new SimpleAdapter (mContext, listItem, R.layout.affiche_boutique,new String[] {"img", "titre", "description","Prix","uniqueID"}, new int[] {R.id.img,R.id.titre, R.id.description,R.id.prix,R.id.uniqueID}); //works fine
    maListViewPerso.setAdapter(mSchedule); //doesn't work
    }
};
t.start();
}

вот мой лог кот:

11-04 19:20:33.070: E/recuperation phonster(546): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Кажется, что я не могу "получить доступ" к maListViewPero, находясь в своем потоке... (maListViewPerso определен ранее в моем коде onCreate:

public class DisplayInternet  extends Activity{
private ListView maListViewPerso;
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ceinture_lv);
    maListViewPerso = (ListView) findViewById(R.id.listviewperso);
    recup_list_internet();
}   

Итак, где я могу поместить эту строку, чтобы она работала? "maListViewPerso.setAdapter(mSchedule);"

потому что я уже пытаюсь объявить mSchedule вне своего потока (в финале), но внутри своего потока, я не могу получить к нему доступ (и поэтому я не могу использовать его после строки «t.start()»


person Ronandroid    schedule 04.11.2012    source источник


Ответы (2)


Внутри вашего потока используйте:

View.post(Runnable r)

который в основном говорит: «Эй, UI-поток, выполни это для меня» — и помещает в runnable весь код, который должен быть выполнен в UI-потоке — это особенно полезно, когда у вас есть поток, извлекающий данные из сети (который должен не запускаться в потоке пользовательского интерфейса), но затем должен опубликовать результаты в пользовательском интерфейсе (что должно быть сделано из потока пользовательского интерфейса)

пример:

view.post(new Runnable(){ 
    public void run(){
        //put all the code you want to be execute on the UI thread here
    }
});
person thedayofcondor    schedule 04.11.2012
comment
Мой код выше с обработчиком работает нормально... но я попробую ваш код, спасибо - person Ronandroid; 05.11.2012
comment
могу я попросить вас пример того, что такое Runnable? - person Ronandroid; 05.11.2012
comment
new Runnable(){ public void run(){ //поместите сюда весь код} }; - отправьте это с помощью view.post, весь код внутри скобок будет отправлен в поток пользовательского интерфейса для выполнения - person thedayofcondor; 05.11.2012

Попробуйте функцию runOnUi, чтобы «касаться» представлений в вашем основном потоке из других потоков.

person Joe Razon    schedule 03.07.2013