Android:在哪里调用其余的来电

时间:2016-04-02 22:25:46

标签: android rest retrofit

我正在制作一个使用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);

问题

  1. 进行REST呼叫的最佳位置是什么?我不认为onCreate()方法是最好的方法。我必须记住,每次从活动B返回时都必须进行REST调用。这总是从API获取最新数据。
  2. 当从活动B按下后退按钮时,在活动A中进行REST调用的数据(gateId)将丢失。保存这个的最佳方法是什么? (SharedPreferences,startActivityForResult,...)

3 个答案:

答案 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中,并监视一个地方的所有请求。