【问题标题】:Retrofit - Not calling API call when app is in background/closed改造 - 当应用程序处于后台/关闭时不调用 API 调用
【发布时间】:2020-03-25 09:51:08
【问题描述】:

我正在使用带有 OkHttp 的 Retrofit2。一切都很好,除了一件事 - 应用关闭或在后台时的网络调用。'

工作

每当 Firebase 通知到达时,我都会进行网络调用以获取与 该通知,然后显示通知。

场景

考虑一个在后台或关闭并收到通知的 Android 应用。

发生了什么

通知成功到达,我可以看到。但是当我尝试拨打电话时,它 总是给出错误“java.net.SocketTimeoutException”无法连接到 ******* 而且我看不到服务器上有任何呼叫。

我的改造课

@Singleton
@Provides
static Retrofit provideRetrofitInstance(){
    OkHttpClient.Builder client = new OkHttpClient.Builder();
    client.connectTimeout(300, TimeUnit.SECONDS)
            .callTimeout(300, TimeUnit.SECONDS)
            .writeTimeout(300, TimeUnit.SECONDS)
            .readTimeout(300, TimeUnit.SECONDS)
            .retryOnConnectionFailure(true);

    return new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .client(client.build())
            .build();
}

我的工作经理类

@NonNull
@Override
public Result doWork() {

    String encodedString = getInputData().getString(Constants.MODEL);

   // Starting foreground service
    setForegroundAsync(createForegroundInfo());

   //calling the api
  }

初始化工作管理器

 NotificationModel model = new NotificationModel(
                    intent.getStringExtra(Constants.KEY_MSG_TITLE),
                    intent.getStringExtra(Constants.KEY_MSG_BODY),
                    intent.getStringExtra(Constants.KEY_TYPE),
                    intent.getStringExtra(Constants.KEY_NOTIFCATION_ID),
                    intent.getStringExtra(Constants.KEY_SHOW),
                    intent.getStringExtra(Constants.KEY_NOTIFICATION_TYPE));

            String encodedModel = Helper.serializeToJson(model);

            Data createGroup = new Data.Builder()
                    .putString(Constants.MODEL , encodedModel)
                    .build();


            uploadWorkRequest = new OneTimeWorkRequest.Builder(AlertWorker.class)
                    .setInputData(createGroup)
                    .build();

            WorkManager.getInstance().enqueue(uploadWorkRequest);

清单中的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission 
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" 
/>

【问题讨论】:

  • 这意味着它无法连接到您的服务器。检查您使用的 URL 以及设备上的网络。如果您的服务器是本地服务器而不是具有公共 IP 的真实服务器,请确保您在同一个 wifi 上,并且您的路由器配置为允许从其他设备到服务器的流量。如果您使用的是模拟器,请记住基本 url 不是 127.0.0.1,模拟器是它自己的设备,它们需要通过虚拟网络相互通信。
  • 我的 URL 是 https,它是在生产服务器上上传的。当应用程序运行时它工作正常,但当应用程序在后台时会导致该问题。而且我使用的是真实设备而不是模拟器。谢谢
  • 你如何安排你的 WorkManager 课程?
  • 收到通知后,我安排工作经理
  • 你能显示这段代码吗?我问的是如何,而不是何时。

标签: android retrofit android-service android-workmanager


【解决方案1】:

你需要做一个后台服务,所以 检查此链接https://developer.android.com/about/versions/oreo/background

【讨论】:

    【解决方案2】:

    在将您的工作排入队列时,我会添加一个约束条件,告诉 WorkManager 您的工作需要有效的网络连接:

    uploadWorkRequest = new OneTimeWorkRequest.Builder(AlertWorker.class)
        .setInputData(createGroup)
        .setConstraints(new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build())
        .build();
    
    WorkManager.getInstance().enqueue(uploadWorkRequest);
    

    有了这个限制,一旦有网络,你的工作就会被执行。

    【讨论】:

    • 添加约束后,我发现当应用程序在后台时,我的应用程序没有互联网过剩。打开应用程序后,工作经理工作成功。我已经在清单文件中添加了 Internet 权限。当应用程序在后台时,我还能做些什么来允许我的应用程序使用互联网?谢谢
    • 您在哪部手机上进行测试?一些手机对特定应用实施严格的规定。检查您的应用是否可以列入白名单
    • 我正在使用小米 (MI) 手机。我已经在 Nexus 和华为的手机上进行了测试,一切正常。现在,我正在解决小米手机的问题。
    猜你喜欢
    • 2019-06-17
    • 2017-11-06
    • 2018-10-06
    • 2016-02-24
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多