片段getActivity返回null因为尚未调用onAttach,如何同步?

时间:2013-06-17 13:25:12

标签: android android-fragments android-lifecycle

我有一个自定义的Fragment制表应用程序。有一次我想从服务器接收这样的答案时打开一个片段。然后在这个片段中调用processResult方法。但是我在处理过程中使用的getActivity得到了null结果。

如何等待循环结束从我的主程序调用进程方法?

以下是main的代码:

@Override
public void onDeleteReservation(final SCHttpResult result,
        final SCWebServiceError err) {
    final Fragment f = getCurrentFragment();
    if (f != null) {

        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                if (f instanceof MyTripsFragment) {
                    ((MyTripsFragment) f).processReservationCancel(result,
                            err);

                    if (err != null) {
                        if (err.getType() != SCWebServiceErrorType.SCWebServiceErrorTypeConfirmationNeeded) {
                            onSCError(err);
                        }
                    }
                }
            }
        });

        if (!(f instanceof MyTripsFragment)) {
            Fragment frag = new MyTripsFragment();
            replaceFragment(frag);
            ((MyTripsFragment)frag).processReservationCancel(result, err);
        }}}

如果仍然显示生成应用程序 - 服务器交换的片段,则一切正常,但是如果(有错误(我必须在错误上添加if测试)并且用户已切换到另一个片段){我必须把他带回到这个片段来处理错误并问他想做什么。}

在processReservationCancel中,我创建了一个getActivity来检索main函数并显示错误。这样就失败了:

06-17 15:16:57.580: E/SC - SCMainActivity(12692): Replace Fragmt: class com.snapcar.rider.fragment.MyTripsFragment
06-17 15:16:57.580: E/SC - MyTripsFragment(12692): Process Reservation Cancel
06-17 15:16:57.585: D/SC - BookingFormFragment(12692): BookingFormFragment-°°°°°° remove VIEW  °°°°°° 
06-17 15:16:57.585: D/SC - MyTripsFragment(12692): MyTripsFragment- result = {"confirmation_message":"\u00cates-vous s\u00fbr de vouloir annuler ? Des frais de r\u00e9servation de 10 \u20ac TTC vous seront factur\u00e9s."}
06-17 15:16:57.590: D/SC - SCBaseFragment(12692): SCBaseFragment-=== removeReq: tag_reservations_delete; removeLoading: true
06-17 15:16:57.590: D/SC - SCBaseFragment(12692): SCBaseFragment-=== cannot remove loading ===
06-17 15:16:57.590: E/SC - SCBaseFragment(12692): toggleLoading - null activity
06-17 15:16:57.590: E/SC - MyTripsFragment(12692): getActivity failed
06-17 15:16:57.605: D/SC - BookingFormFragment(12692): BookingFormFragment-°°°°°° remove VIEW  °°°°°° 
06-17 15:16:57.650: D/SC - MyTripsFragment(12692): MyTripsFragment-onAttach is CAAAAALLLED
06-17 15:16:57.650: E/SC - MyTripsFragment(12692): Fragment Mytrips created
06-17 15:16:57.670: D/AbsListView(12692): Get MotionRecognitionManager
06-17 15:16:57.670: D/SC - AnalyticsManager(12692): AnalyticsManager-tagScreen - MyTripsFragment starting
06-17 15:16:57.670: E/SC - MyTripsFragment(12692): onResume - start
06-17 15:16:57.670: E/SC - MyTripsFragment(12692): onResume - gonna start getMyTrips

正如您所看到的,主要功能并不是等待新片段的创建完成以启动processReservationCancel(),因此它失败了。

关于如何做的任何想法?

PS:我不能轻易通过bundle + flag为processReservationCancel提供参数,因为它不是String或boolean,而是Http响应和错误。

2 个答案:

答案 0 :(得分:2)

我使用像这样的脏技巧(伪代码)

private YourType pendingActionParams;

public void yourMethod(YourType parameters){
    if(isVisible()){
        performAction(parameters);
    }else{
        pendingActionParams = parameters;
    }
}

@Override
public void onActivityCreated (Bundle savedInstanceState){
    if(pendingActionParams != null){
        performAction(pendingActionParams);
        pendingActionParams = null;
    }
}

答案 1 :(得分:0)

所以我用这种方式似乎工作正常:

                    int i = 0;
                while (frag.getActivity() == null && i < 300) {
                    Dbg.d(TAG, " ---------- Sleeping while ");
                    i++;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                ((MyTripsFragment)frag).processReservationCancel(result, err);

rciovati的回答看起来更好,因为它不使用睡眠。在我的情况下,while循环只调用一次,有时两次,所以它非常快但仍然......