У меня есть приложение, которое показывает статьи новостей в виде списка внутри фрагмента. Когда фрагмент первым создал, я начинаю что-нить будет получать список статей (Stories) через API вызовВозврат результата потока в Фрагмент с использованием реализации интерфейса
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = getActivity();
new GetStoriesThread(mContext,this).start();
Оба фрагмент и Thread реализовать тот же интерфейс для передачи данных из потока фрагменту
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() из рабочего потока, но я думал, что это правильное использование интерфейсов. Не вызван ли метод вызовом в классе фрагментов? –
Очевидно, что нет - все, что вы вызываете из потока, выполняется в этом потоке, и это не должно содержать никакой памяти, которую использует ваш основной поток. onPreExecute и onPostExecute методы AsyncTask выполняются в основном потоке, поэтому они удобны для таких взаимодействий. – kalinrj
Я вижу. Спасибо вам за разъяснение ! –