0

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

如何等待循环结束以从我的 main 调用 process 方法?

这是来自主要的代码:

@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 来检索主要功能并显示错误。以这种方式失败了:

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 的参数,因为它不是字符串或布尔值,而是 Http 响应和错误。

4

2 回答 2

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;
    }
}
于 2013-06-17T14:06:33.810 回答
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循环只被调用一次,有时是两次,所以它非常快但仍然......

于 2013-06-17T16:47:07.583 回答