2012-11-04 45 views
1

我不是複製所有的原因,而是太長的代碼定義適配器,但要簡明扼要:不能在一個線程

我有一個fonction(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()」之後使用它)。線

回答

1

你的線程內,使用方法:

View.post(Runnable r)

基本上說:「嘿,UI線程,執行這個事情對我來說」 - 並把其必須在執行的可運行所有的代碼UI線程 - 當你有一個線程從網絡中檢索數據時(這個線程不能在UI線程上運行),這個特別有用,但是必須發佈在UIË結果(必須從UI線程來完成)

例如:

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

我的代碼上面的處理程序工作正常......但我會嘗試你的代碼,謝謝 – Ronandroid

+0

我可以問你一個什麼樣的「Runnable」? – Ronandroid

+0

new Runnable(){public void run(){//把你所有的代碼放在這裏}}; - 提交vith view.post,括號內的所有代碼將被髮送到UI線程執行 – thedayofcondor

0

嘗試runOnUi功能「觸摸」的觀點在你的主線程,其它線程。