2014-04-28 3 views
0

У меня есть приложение, которое показывает статьи новостей в виде списка внутри фрагмента. Когда фрагмент первым создал, я начинаю что-нить будет получать список статей (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, и это совершенно другая проблема.

Спасибо заранее!

ответ

2

Вы вызываете onGetStoriesThreadResult() из рабочего потока? Вы не должны. Рассмотрите возможность использования AsyncTask <> вместо открытого потока, переопределите метод onPostExecute() и вызовите свои события оттуда.

+0

Да, я вызываю onGetStoriesThreadResult() из рабочего потока, но я думал, что это правильное использование интерфейсов. Не вызван ли метод вызовом в классе фрагментов? –

+0

Очевидно, что нет - все, что вы вызываете из потока, выполняется в этом потоке, и это не должно содержать никакой памяти, которую использует ваш основной поток. onPreExecute и onPostExecute методы AsyncTask выполняются в основном потоке, поэтому они удобны для таких взаимодействий. – kalinrj

+0

Я вижу. Спасибо вам за разъяснение ! –

Смежные вопросы