我有这样的任务:需要从互联网下载图像并每隔15分钟将它们设置为视图的背景(用户设置周期)。 我做过类似的事情:
我有JobService
,它下载图像并将其作为文件保存到创建的目录中。在发送广播之后,接收器接收它并将文件名设置为它的监听器。监听器 - 我的班级LauncherApplication
扩展了应用程序,它是在所有活动之前创建的,我保存了它的实例,因此我可以从程序的每个部分加载文件中的图像。我用这样的AsyncTask
执行它,执行它如有必要,请OnResume()
:
public class BackgroundImageAsyncChanger extends AsyncTask<String, Void ,Drawable> {
private int pictureNumber;
private View backgroundView;
private Context context;
public BackgroundImageAsyncChanger(View backgroundView, Context context, int pictureNumber) {
this.backgroundView = backgroundView;
this.context = context;
this.pictureNumber = pictureNumber;
}
@Override
protected Drawable doInBackground(String ... imageFilesNames) {
final int index = pictureNumber;
final Bitmap bitmap = ImageFileOperator.getInstance().loadImage(context, imageFilesNames[index]);
final Drawable drawable = new BitmapDrawable(context.getResources(), bitmap);
return drawable;
}
@Override
protected void onPostExecute(Drawable backgroundImage) {
backgroundView.setBackground(backgroundImage);
}
}
所以有问题。从Internet上下载图像需要花费时间,当它们在Activity / Fragment OnResume()之后下载时,它不会改变背景。 我怎样才能更好地实现它?
感谢每一个人的答案!
答案 0 :(得分:1)
下载每个图像都可能导致内存泄漏,这不是一个好主意。
您可以使用Glide
以下是工作示例:
Glide.with(context)
.load(imageUrl) // or URI/path
.placeholder(placeholder)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.priority(Priority.IMMEDIATE)
.error(placeholder)
.skipMemoryCache(false)
.dontAnimate()
.listener(listener) // you can skip this if do not want to handle callback
.into(imageView); //imageview to set thumbnail to.
希望它能帮到你
答案 1 :(得分:1)
picasso 使用简单
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
<强>滑翔强>
Glide.with(mContext).load(imgUrl)
.thumbnail(0.5f)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
在这种情况下你不需要担心下载图像。一旦加载它就会自动投影到图像视图上。并自动缓存管理。
/ ********************************************** *********** /
因为每15分钟你的作业调度程序从服务器或其他任何地方获取url,所以假设你有一个函数调用
private void jobScheduler(){
new url generates here
call the function to load image and send the url as paramater
loadImages(url);
}
在这里你每隔<15分钟
private void loadImages(String url){
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
}
答案 2 :(得分:0)
而不是下载图像,
你可以使用毕加索/滑翔等第三方直接加载图像。
<强>毕加索强>
Picasso.with(mContext)
.load(imageUrl)
.placeholder(R.drawable.img_placeholder)
.error(R.drawable.img_error)
.into(mImageView);
<强>滑翔强>
Glide.with(mContext)
.load(imageUrl)
.thumbnail(0.5f)
.crossFade()
.skipMemoryCache(false)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(mImagelistener)//optional
into(mImageView);
每隔一段时间升级图像,
您可以设置重复闹钟以在某个时间间隔发送特定广播
参考:Set Repeating Alarm Every Day at Specific time In Android
或
你可以定时器/处理程序类在特定的时间间隔内获取事件
(根据您的应用结构使用)
答案 3 :(得分:0)
我开发了一个类似的服务来配置壁纸,计划任务是通过“工作服务”来管理
MyService myService;
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg){
myService = (MyService) msg.obj;
myService.setUICallback(YourActivity.this);
}
};
myServiceComponent = new ComponentName(this, MyService.class);
设置:
JobInfo.Builder builder = new JobInfo.Builder(0, myServiceComponent);
//builder.setRequiresCharging(true);
//builder.setRequiresDeviceIdle(true);
builder.setExtras(bundle);//if you need
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);//only wifi
builder.setPeriodic(900000);//15 min, dont try set less
builder.setPersisted(true);
myService.scheduleJob(builder.build());
和职业服务类中的任务
public class MyService extends JobService{}
垃圾邮件:您可以看到de live project here