Java 如何从Internet下载图像并在运行时多次将其设置为背景?
我有这样的任务:需要从互联网上下载图像,并每隔15分钟将其设置为视图的背景(用户设置时段)。 我做过类似的事情: 我有Java 如何从Internet下载图像并在运行时多次将其设置为背景?,java,android,performance,Java,Android,Performance,我有这样的任务:需要从互联网上下载图像,并每隔15分钟将其设置为视图的背景(用户设置时段)。 我做过类似的事情: 我有JobService,它下载图像并将它们作为文件保存到创建的目录中。在发送广播后,接收者接收广播并为其侦听器设置文件名。Listener-我的类LauncherApplication扩展了应用程序,它是在所有活动之前创建的,我保存了它的实例,因此我可以从程序的每个部分的文件中加载图像。我使用这样的AsyncTask,必要时在OnResume()中执行它: public类backg
JobService
,它下载图像并将它们作为文件保存到创建的目录中。在发送广播后,接收者接收广播并为其侦听器设置文件名。Listener-我的类LauncherApplication
扩展了应用程序,它是在所有活动之前创建的,我保存了它的实例,因此我可以从程序的每个部分的文件中加载图像。我使用这样的AsyncTask
,必要时在OnResume()
中执行它:
public类backgroundImageAsyncTask{
私用int-pictureNumber;
私人观点背景观点;
私人语境;
public BackgroundImageAsyncChanger(查看背景视图、上下文上下文、int-pictureNumber){
this.backgroundView=背景视图;
this.context=上下文;
this.pictureNumber=pictureNumber;
}
@凌驾
受保护的可绘制doInBackground(字符串…图像文件名){
最终int索引=pictureNumber;
最终位图位图=ImageFileOperator.getInstance().loadImage(上下文,ImageFileNames[index]);
final Drawable Drawable=新的BitmapDrawable(context.getResources(),位图);
回拉;
}
@凌驾
受保护的void onPostExecute(可绘制背景图像){
背景视图。挫折背景(背景图像);
}
}
这就是问题所在。从Internet下载图像需要时间,在活动/Fragment OnResume()之后下载图像时,不会改变背景。
如何更好地实施它
谢谢大家的回答 下载每个图像都会导致内存泄漏,这不是一个好主意 你可以用 以下是工作示例:
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.
希望它能帮助你下载图片会更好。使用或 毕加索使用简单
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);
Glide.with(mContext)
.load(imageUrl)
.thumbnail(0.5f)
.crossFade()
.skipMemoryCache(false)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(mImagelistener)//optional
into(mImageView);
在这两种情况下,您都不需要担心下载图像。一旦图像加载,它会自动投影到图像视图中。并自动进行缓存管理
/*********************************************************/
因为每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);
}
而不是下载图像,
您可以使用第三方(如毕加索/格莱德)直接加载图像 毕加索
Picasso.with(mContext)
.load(imageUrl)
.placeholder(R.drawable.img_placeholder)
.error(R.drawable.img_error)
.into(mImageView);
滑翔
Glide.with(mContext).load(imgUrl)
.thumbnail(0.5f)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
Glide.with(mContext)
.load(imageUrl)
.thumbnail(0.5f)
.crossFade()
.skipMemoryCache(false)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(mImagelistener)//optional
into(mImageView);
要每隔特定时间间隔升级映像,您可以设置重复报警以在某个时间间隔发送特定广播。
参考:
或
您可以使用计时器/处理程序类在特定时间间隔获取事件。
(根据您的应用程序结构使用)我开发了一个类似的服务来配置壁纸,日程安排任务由“作业服务”管理 设置:
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());
以及jobservice类中的任务
public class MyService extends JobService{}
检查这个
垃圾邮件:您可以在onClick中看到de-live项目尝试更改背景。
backgroundView.setBackground(backgroundImage)中可能存在问题
但是我怎样才能每15分钟升级一次图像?图像的链接是否每15分钟更改一次?我有JobService,它每15分钟工作一次并获取新url使用后台线程,以便它每15分钟调用负责加载图像的函数,或者一旦我们的job service获取新url,就调用该函数加载图像功能你能解释一下吗?另外,我可以使用Glide来设置要查看的图像吗?但是如何每15分钟升级一次图像?升级。。。?是否要将图像上载到服务器…?我需要将图像加载到视图,而不是ImageView。而我不能用毕加索/格莱德。。。