我有一个自定义的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响应和错误。
答案 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循环只调用一次,有时两次,所以它非常快但仍然......