我正在寻找一种将数据上传到 Firebase 的解决方案,而无需用户等待数据上传,以便用户可以在离线模式下使用该应用程序。
我们假设该应用程序是关于地点的。在此应用程序中,用户可以上传图像和包含地址、城市、州、国家、纬度、经度、描述等的对象。假设是一个大 POJO。
Firebase 实时数据库和 Firebase Firestore 可以等待(我不知道多久)稳定的互联网连接来发送数据。但Firebase Storage没有这个功能。
所以我找到了WorkManager。它似乎解决了问题,但我必须将 POJO 序列化为小的原始变量类型才能将 POJO 发送到Worker类。
我想要达到的结果是:
1)将图像上传到Firebase存储
2) 图片的下载地址
3) 将 POJO 发送到 Firebase Firestore,其中包含 ImageUrl。
问题
1)WorkManager最适合这种目的吗?
2) 在离线模式下,用户可以触发此后台作业多少次而不会对应用程序造成任何问题?
3)如何正确地将POJO发送到班级Worker?
这是我到目前为止所做的:
获取新地点的 PushKey,启动后台作业并继续浏览活动:
savePlaceData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DocumentReference docRef = DatabaseRouter.getPlaceCollectionRef().document();
String key = docRef.getId();
uploadPlaceDataInBackground(key)
Intent intent = new Intent(PlaceActivity.this, OtherActivity.class);
startActivity(intent);
}
});
Run Code Online (Sandbox Code Playgroud)
设置后台作业的请求:
private void uploadPlaceDataInBackground(String placeKey) {
// TESTING …Run Code Online (Sandbox Code Playgroud) android firebase-storage google-cloud-firestore android-workmanager
当我单击某个项目时,有时可以工作,有时会崩溃。
\n\n以下是单击某个项目后出现的致命异常。
\n\n2020-03-31 21:59:18.087 15383-15383/com.aliton.myapp E/AndroidRuntime: FATAL EXCEPTION: main\n Process: com.aliton.myapp, PID: 15383\n java.lang.IllegalStateException: View androidx.constraintlayout.widget.ConstraintLayout{b3bb13b V.E...C.. .......D 0,336-720,518} does not have a NavController set\n at androidx.navigation.Navigation.findNavController(Navigation.java:84)\n at com.aliton.myapp.Adapter.StoreSelectAdapter$StoreSelectViewHolder$1.onChanged(StoreSelectAdapter.java:147)\n at com.aliton.myapp.Adapter.StoreSelectAdapter$StoreSelectViewHolder$1.onChanged(StoreSelectAdapter.java:142)\n at androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)\n at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:149)\n at androidx.lifecycle.LiveData.setValue(LiveData.java:307)\n at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)\n at androidx.lifecycle.LiveData$1.run(LiveData.java:91)\n at android.os.Handler.handleCallback(Handler.java:751)\n at android.os.Handler.dispatchMessage(Handler.java:95)\n at android.os.Looper.loop(Looper.java:154)\n at android.app.ActivityThread.main(ActivityThread.java:6351)\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786)\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,首先我需要将一个项目 ( StoreEntity) 插入到我的房间数据库中,侦听它id,然后导航到具有在中定义的对象的其他片段direction。
下面是我的适配器:
\n\npublic class StoreSelectAdapter extends RecyclerView.Adapter<StoreSelectAdapter.StoreSelectViewHolder> {\n\n private static final …Run Code Online (Sandbox Code Playgroud)