Java 如何从Internet下载图像并在运行时多次将其设置为背景?

Java 如何从Internet下载图像并在运行时多次将其设置为背景?,java,android,performance,Java,Android,Performance,我有这样的任务:需要从互联网上下载图像,并每隔15分钟将其设置为视图的背景(用户设置时段)。 我做过类似的事情: 我有JobService,它下载图像并将它们作为文件保存到创建的目录中。在发送广播后,接收者接收广播并为其侦听器设置文件名。Listener-我的类LauncherApplication扩展了应用程序,它是在所有活动之前创建的,我保存了它的实例,因此我可以从程序的每个部分的文件中加载图像。我使用这样的AsyncTask,必要时在OnResume()中执行它: public类backg

我有这样的任务:需要从互联网上下载图像,并每隔15分钟将其设置为视图的背景(用户设置时段)。 我做过类似的事情:

我有
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。而我不能用毕加索/格莱德。。。