我正在制作一个使用Retrofit2进行REST调用的Android应用程序。但我不确定应用程序的结构。
当活动A被启动时(来自他父母的Intent),在getData()方法中进行REST调用,该方法将从活动的onCreate()方法调用。要执行此REST调用,将传递一个变量(gateId),其意图是启动活动A.
@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)Intent intent = new Intent(getApplicationContext(), ShipmentToggle.class);
intent.putExtra(KeyConstants.GATE_ID, gateActionDTO.getGateOid());
startActivity(intent);
答案 0 :(得分:0)
在您的流程中没有最好的位置,每次都被认为是最好的。您必须指定何时需要拨打电话。如果您必须拨打一次电话,在应用程序启动时,您可以将其放在SplashScreen活动中的onCreate()
内,然后切换到主要活动。
通常情况下,如果使用MVP模式,则会实例化Presenter,并在该对象上调用myPresenter.makeCallToApi();
。如果没有充分的理由将它放在别处,它应该在onCreate()
。如果你从活动B回到来电活动,你可以检查你是否打过电话,如果是,不要再做了。
提供有关特定用例的更多信息。
更新1
如果在活动A中您需要来自API的数据,然后您转到B而不缓存该数据(DB,文件,SharedPreferences),那么您应该再次进行该调用。您希望用户在返回时看到相同的信息。它更新了,甚至更好。
答案 1 :(得分:0)
保存此功能的最佳方法是什么? (SharedPreferences,startActivityForResult)
你可以使用`startActivityForResult,如果你想将gateId从活动B传递到A
Intent intent = new Intent(getActivity(),ActivityB.class);
intent.putExtra("gateId", gateId);
startActivityForResult(intent, addComment);
从活动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();
}
并从onActivityResult
获取“gateId”的值。但是,由于您将restAPI调用放入onCreate,因此需要在getData()
中调用RestAPI或onActivityResult
。使用此workaroung将使您在活动中编写更多代码。
进行REST呼叫的最佳位置是什么?在您的情况下
最简单的方法我认为您可以使用SharedPreference
保存“gateID”并将getData()
/ api放入onResume
并在调用api之前检查gateID。所以你不必担心ActivityB中的“gateID”值。
答案 2 :(得分:0)
我刚开始做的是使用RxJava来监控请求,它可以很好地工作而不会发送参数和回调。
所以基本上我有一个单例,我可以发起请求,然后由Observable包装,然后由任何人需要它监视。
因此片段A在需要执行操作,刷新等任何时候发送数据。它并不关心是否有人会得到它。
片段B监视ObservableB,它应该有标记[B]的请求。它不需要知道请求来自何处,只知道它的用途。因此片段B将在以下情况下收到请求:
1)它已在收到请求之前初始化
2)它已在收到请求后初始化
如果片段B在发送请求之前死亡,则只需从Observable取消订阅。
这样代码是干净的模块化,非常容易测试和调试,当然更快(反应):)
Retrofit能够返回Observables,它在版本2中添加了取消选项,非常方便。
我个人使用Volley的扩展,我打电话给jus。它具有与Retrofit几乎相同的功能。
有什么好处是你可以将整个请求队列包装在一个observable中,并监视一个地方的所有请求。