我有一个获取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对话框,应用崩溃。因此,有没有针对我的目的的性能架构建议?
在此先感谢专家的帮助
答案 0 :(得分:0)
所以我应该将Firebase Job Dispatcher与Job Service用于 在本地存储中下载图像并将其保存?
因为当对FCM消息执行onMessageReceived
时,您的应用程序处于运行状态。无需使用Firebase Job Dispatcher
还有其他选择吗?
是的,如果用户看不到应用程序,请使用WorkManager下载图像。将图像保存在缓存或sdcard中,并在用户打开应用程序时显示。
尽管我很晚才开始求职服务很多次 使用setTrigger(Trigger.executionWindow(0,0))
WorkManager提供用于检查任务的选项是否完成,然后再次启动同一任务。
OR
如果应用程序已在运行,则使用常规服务,例如IntentService
或Service
。