Android - установка данных в представлениях фрагмента на основе ответа асинхронного сервера

У меня есть следующий фрагмент, как показано ниже, в котором метод onPostNetworkRequestWithCode() вызывается обратно другой частью кода (приложение расширяет класс Application, который выполняет сетевые запросы) для рисования представлений

Поскольку цепочка создания фрагмента (onCreate(), onCreateView () и т. Д.) Вызывается в другом потоке, чем onPostNetworkRequestWithCode(), который перерисовывает представления, иногда возникает состояние гонки, когда метод onPostNetworkRequestWithCode() не находит представление для покрасить. Как я могу попросить его подождать, пока создание представления не будет завершено, и затем возобновить публикацию этого?

public class MeStatsTableFragment extends Fragment implements HttpResponseHandlerWithResponseCode {

    private static final String LINKED_USER_ID = "linkedUserId";
    private Context mContext;

    public MeStatsTableFragment() {
        // Required empty public constructor
    }

    public static MeStatsTableFragment newInstance(long linkedUserId, Context context) {
        MeStatsTableFragment fragment = new MeStatsTableFragment();
        Bundle args = new Bundle();
        args.putLong(LINKED_USER_ID, linkedUserId);

        fragment.setArguments(args);
        fragment.mContext = context;
        return fragment;
    }


    /**
     * This is responsible for painting the chart after data is obtained by parent Me Fragment
     */
    @Override
    public void onPostNetworkRequestWithCode(HttpResponseCode responseCode) {

        long linkedUserId = getArguments().getLong(LINKED_USER_ID);
        MePageInfo m = App.getAppData().getMePageInfoById(linkedUserId);


        View v = getView();

        if (v == null) {
            Log.d("XXX", "Stats fragment Got stuck at view == null in Stats Fragment");
            // do nothing else, just return
        } else{


            v.findViewById(R.id.text_name).setText(m.name);
            // do other painting similarly with the view and the variable m



    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_me_stats_table, container, false);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }


}

1 ответ

Вы можете использовать greenrobot EventBus ( https://github.com/greenrobot/EventBus) - и сделать липкое сообщение в случае, когда еще нет фрагмента.

Вот больше информации о липком посте и регистрации - https://github.com/greenrobot/EventBus/blob/master/HOWTO.md#sticky-events

Другие вопросы по тегам