我应该使用Firebase Job Dispatcher

时间:2018-11-19 11:51:32

标签: android firebase-cloud-messaging android-broadcastreceiver android-jobscheduler firebase-job-dispatcher

我有一个获取FCM数据消息(包含图像URL)的android应用。 在onMessageReceived()中接收到数据消息后,我将创建一个FirebaseJobDispatcher和一个Job,然后计划该Job以下载图像并将其保存在本地存储dispatcher.mustSchedule(myJob)中。

下载和保存映像Job扩展了JobService。作业启动后,我创建了一个线程,在其中下载并保存图像,然后将BroadcastReceiver发送到活动中,以便它使用Picasso在ImageView中从本地存储中显示新图像(以下代码):

private String imageName = "image.jpg";

    @Override
    public boolean onStartJob(final JobParameters jobParameters) {
        Log.d(TAG, "Update local storage content with new Image!");
        Target target = new Target() {
            @Override
            public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
                // Delegating work to a new Thread since it can be long task (downloading Image and storing it to local file system)
                Thread storeImageThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                       // File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + imageName);

                        File file = new File(getApplicationContext().getFilesDir(), imageName);
                        try {
                            file.createNewFile();
                            FileOutputStream ostream = new FileOutputStream(file);
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 75, ostream);
                            ostream.flush();
                            ostream.close();
                        } catch (IOException e) {
                            e.getLocalizedMessage();
                        }finally {
                            Intent intent = new Intent("com.example.SendBroadcast");
                            //intent.putExtra("imageURL", remoteMessage.getData().get("image"));
                            intent.setAction("com.example.SendBroadcast");
                            PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent,
                                    PendingIntent.FLAG_UPDATE_CURRENT);
                          //  sendBroadcast(intent);
                            sendOrderedBroadcast(intent,null);
                            //Tell the framework that the job has completed and does not need to be reschedule
                            jobFinished(jobParameters, true);
                        }
                    }
                });
                storeImageThread.start();
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {

            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        };

        Picasso.with(getApplicationContext())
                .load(jobParameters.getExtras().getString("image"))
                .into(target);


        return true;
    }

我在这种架构上面临一些问题; -尽管我使用 setTrigger(Trigger.executionWindow(0, 0)) ,但Job Service的启动时间很晚,很多次。因此,我应该使用带有Job Service的Firebase Job Dispatcher来下载映像并将其保存在本地存储中吗?还有其他选择吗?

  • 完成下载并保存图像后,是否有更多性能和有效的方式来更新活动?

  • 我认为Picasso使用单独的线程下载图片,所以这里的Thread使用正确吗?

  • 很多时候,我收到ARN对话框,应用崩溃。因此,有没有针对我的目的的性能架构建议?

在此先感谢专家的帮助

1 个答案:

答案 0 :(得分:0)

  

所以我应该将Firebase Job Dispatcher与Job Service用于   在本地存储中下载图像并将其保存?

因为当对FCM消息执行onMessageReceived时,您的应用程序处于运行状态。无需使用Firebase Job Dispatcher

  

还有其他选择吗?

是的,如果用户看不到应用程序,请使用WorkManager下载图像。将图像保存在缓存或sdcard中,并在用户打开应用程序时显示。

  

尽管我很晚才开始求职服务很多次    使用setTrigger(Trigger.executionWindow(0,0))

WorkManager提供用于检查任务的选项是否完成,然后再次启动同一任务。

OR

如果应用程序已在运行,则使用常规服务,例如IntentServiceService