【发布时间】: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