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

时间:2018-02-12 07:18:11

标签: java android performance

我有这样的任务:需要从互联网下载图像并每隔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()之后下载时,它不会改变背景。 我怎样才能更好地实现它?

感谢每一个人的答案!

4 个答案:

答案 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)

下载图片效果更佳。使用PicassoGlide

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{}

检查此tutorial for jobservice

垃圾邮件:您可以看到de live project here