无法在线程中定义适配器

时间:2012-11-04 19:46:24

标签: android multithreading simpleadapter

我不会复制所有代码,因为它太长了,但要简明扼要:

我有一个函数(recup_list_internet),其中有一个线程,它从互联网(XML)检索数据,解码它,并将每个“节点”分配给我的适配器中的元素。

在Thread外部进行解码时,一切正常。 所以我修改它在线程内部使用,在其中创建一个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(在最后)但在我的Thread中,我无法访问它(因此,我无法在“t.start()”行之后使用它

2 个答案:

答案 0 :(得分:1)

在你的主题中,使用:

View.post(Runnable r)

基本上说“嘿,UI线程,为我执行这个东西” - 并且将所有必须在UI线程中执行的代码放入runnable中 - 当你有一个线程从网络中检索数据时,这个特别有用(不得在UI线程上运行)但必须在UI上发布结果(必须从UI线程完成)

示例:

view.post(new Runnable(){ 
    public void run(){
        //put all the code you want to be execute on the UI thread here
    }
});

答案 1 :(得分:0)

尝试使用runOnUi函数从其他线程“触摸”主线程中的视图。