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,這是一個完全不同的問題。
在此先感謝!
是的,我從工作線程中調用onGetStoriesThreadResult(),但我認爲這是對接口的正確使用。 不是在Fragment類中調用的方法嗎? –
顯然不是 - 你從線程調用的任何東西都會在該線程中執行,並且不應該包含主線程使用的任何內存。 AsyncTask的onPreExecute和onPostExecute方法在主線程上運行,因此它們便於進行這種交互。 – kalinrj
我明白了。謝謝你的解釋 ! –