Android:在哪里调用rest调用

Android:在哪里调用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

我正在制作一个Android应用程序,该应用程序正在使用2进行REST调用。但我不确定申请书的结构

当前情景 当活动A启动时(通过其父级的意图),将在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)

问题
  • 打其他电话的最佳地点是哪里?我不认为onCreate()方法是最好的方法。我必须记住,每次从活动B返回时都必须进行REST调用。这是为了始终从API获取最新数据
  • 当从活动B按下后退按钮时,用于在活动A中进行REST调用的数据(gateId)将丢失。什么是拯救这一切的最好方法?(共享参考、startActivityForResult等)

  • 在你的流程中没有一个最佳的地方可以被认为是每次都是最佳的。您必须指定您需要拨打电话的确切时间。如果您必须在应用程序启动时进行一次调用,您可以将其放在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在请求发送之前死亡,它只是取消对可观察对象的订阅

    通过这种方式,代码是干净的模块化,非常容易测试和调试,而且速度更快(反应式)