Android:在哪里调用rest调用
我正在制作一个Android应用程序,该应用程序正在使用2进行REST调用。但我不确定申请书的结构 当前情景 当活动A启动时(通过其父级的意图),将在getData()方法中进行REST调用,该方法将从活动的onCreate()方法调用。要执行此REST调用,将传递一个变量(gateId),其目的是启动活动aAndroid:在哪里调用rest调用,android,rest,retrofit,Android,Rest,Retrofit,我正在制作一个Android应用程序,该应用程序正在使用2进行REST调用。但我不确定申请书的结构 当前情景 当活动A启动时(通过其父级的意图),将在getData()方法中进行REST调用,该方法将从活动的onCreate()方法调用。要执行此REST调用,将传递一个变量(gateId),其目的是启动活动a @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanc
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gate_action);
loadingSpinner = (ProgressBar) findViewById(R.id.loadingSpinner);
gateId = getIntent().getIntExtra(KeyConstants.GATE_ID, -1);
getData(); // Make rest call and fill components on screen
}
从该活动(A)开始,使用startActivity()方法启动另一个活动(B)
问题
在你的流程中没有一个最佳的地方可以被认为是每次都是最佳的。您必须指定您需要拨打电话的确切时间。如果您必须在应用程序启动时进行一次调用,您可以将其放在SplashScreen活动中的
onCreate()
中,然后切换到主活动
通常,如果使用MVP模式,您将实例化一个Presenter,并调用myPresenter.makeCallToApi()代码>在该对象上。如果没有很好的理由将其放置在其他位置,则它应该位于onCreate()
中。如果您从活动B返回到主叫方活动,您只需检查您是否拨打了电话,如果是,请不要再次拨打
提供有关特定用例的更多信息
更新1
如果在活动A中您需要API中的数据,然后在不缓存该数据(DB、文件、SharedReferences)的情况下转到B,那么您应该再次执行该调用。您希望用户返回时看到相同的信息。它被更新了,甚至更好。在你的流程中,没有一个地方可以被认为是每次都是最好的。您必须指定您需要拨打电话的确切时间。如果您必须在应用程序启动时进行一次调用,您可以将其放在SplashScreen活动中的onCreate()
中,然后切换到主活动
通常,如果使用MVP模式,您将实例化一个Presenter,并调用myPresenter.makeCallToApi()代码>在该对象上。如果没有很好的理由将其放置在其他位置,则它应该位于onCreate()
中。如果您从活动B返回到主叫方活动,您只需检查您是否拨打了电话,如果是,请不要再次拨打
提供有关特定用例的更多信息
更新1
如果在活动A中您需要API中的数据,然后在不缓存该数据(DB、文件、SharedReferences)的情况下转到B,那么您应该再次执行该调用。您希望用户返回时看到相同的信息。它已更新,甚至更好。保存此文件的最佳方法是什么?(共享参考,startActivityForResult)
如果要将gateId从活动B传递到A,可以使用“startActivityForResult”
Intent intent = new Intent(getActivity(),ActivityB.class);
intent.putExtra("gateId", gateId);
startActivityForResult(intent, addComment);
从活动B中,您可以在使用完成活动B后获得“gateID”,您可以使用
@Override
public void onBackPressed() {
//set ok result before finish the activity
Intent returnIntent = new Intent();
returnIntent.putExtra("gateId", gateId);
setResult(RESULT_OK, returnIntent);
finish();
//write this to the last so returnIntent can pass the extra value ot onActivityResult or remove it.
super.onBackPressed();
}
并从activityresult
上获取“gateId”的值。但是,由于在onCreate中放入了restAPI调用,因此需要在onActivityResult
中调用restAPI或getData()
。使用此解决方法将使您在活动中编写更多代码
在什么地方打电话最好?在您的情况下
我认为最简单的方法是使用SharedReference
保存“gateID”,将getData()
/api放入onResume
中,并在调用api之前检查gateID。因此,您不必担心ActivityB中的“gateID”值 保存此文件的最佳方法是什么?(共享参考,startActivityForResult)
如果要将gateId从活动B传递到A,可以使用“startActivityForResult”
Intent intent = new Intent(getActivity(),ActivityB.class);
intent.putExtra("gateId", gateId);
startActivityForResult(intent, addComment);
从活动B中,您可以在使用完成活动B后获得“gateID”,您可以使用
@Override
public void onBackPressed() {
//set ok result before finish the activity
Intent returnIntent = new Intent();
returnIntent.putExtra("gateId", gateId);
setResult(RESULT_OK, returnIntent);
finish();
//write this to the last so returnIntent can pass the extra value ot onActivityResult or remove it.
super.onBackPressed();
}
并从activityresult
上获取“gateId”的值。但是,由于在onCreate中放入了restAPI调用,因此需要在onActivityResult
中调用restAPI或getData()
。使用此解决方法将使您在活动中编写更多代码
在什么地方打电话最好?在您的情况下我认为最简单的方法是使用
SharedReference
保存“gateID”,将getData()
/api放入onResume
中,并在调用api之前检查gateID。因此,您不必担心ActivityB中的“gateID”值 我不久前开始做的是使用它来监视请求,它工作得很好,不需要到处发送参数和回调
所以基本上我有一个单例,在这里我可以启动请求,然后被观察对象包装,然后由任何需要它的人监控
所以片段A在需要执行操作、刷新或其他操作时发送数据。它不在乎是否有人会得到它
片段B监视应具有标记为[B]的请求的可观察的B。它不需要知道请求来自何处,只需要知道它的目的。因此,片段B将在以下情况下接收请求:
1) 它在收到请求之前已初始化
2) 它已在收到请求后初始化
如果片段B在请求发送之前死亡,它只是取消对可观察对象的订阅
通过这种方式,代码是干净的模块化,非常容易测试和调试,而且速度更快(反应式)