2014-04-28 55 views
0

我有一個應用程序在片段內的listview中顯示新聞文章。 當第一次創建的片段,我啓動一個線程,將通過API調用使用接口實現將線程結果返回給片段

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     mContext = getActivity(); 

     new GetStoriesThread(mContext,this).start(); 

這兩個片段和線程實現相同的接口從線通過數據獲取的文章(故事)名單該片段

public interface GetStoriesThreadInterface { 
    public void onGetStoriesThreadResult(final ArrayList<Story> result); 
} 

之後線程完成處理,它會調用該接口的方法和數據傳回調用片段。

問題

現在,當我得到片段中的結果,通過這個代碼:

@Override 
public void onGetStoriesThreadResult(final ArrayList<Story> result) 
{ 
    if(result!=null) 
    { 
       mStoriesList.clear(); //mStoriesList is the list that i supply to the adapter of the ListView 
       mStoriesList.addAll(result); 
       adapter.notifyDataSetChanged(); //Exception here 
    } 
} 

我得到以下異常:

04-28 18:03:58.432: E/ViewRootImpl(21513): com.says.news.Stories : Only the original thread that created a view hierarchy can touch its views. 

我知道使用getActivity().runOnUiThread(new Runnable...解決了這個問題,但我不明白爲什麼。有時getActivity()返回null,這是一個完全不同的問題。

在此先感謝!

回答

2

你是否在工作線程中調用onGetStoriesThreadResult()?你不應該。考慮使用AsyncTask而不是裸線程,重寫onPostExecute()方法並從那裏調用你的事件。

+0

是的,我從工作線程中調用onGetStoriesThreadResult(),但我認爲這是對接口的正確使用。 不是在Fragment類中調用的方法嗎? –

+0

顯然不是 - 你從線程調用的任何東西都會在該線程中執行,並且不應該包含主線程使用的任何內存。 AsyncTask的onPreExecute和onPostExecute方法在主線程上運行,因此它們便於進行這種交互。 – kalinrj

+0

我明白了。謝謝你的解釋 ! –

相關問題