Android - установка обоев из пути к файлу занимает больше времени, чем ожидалось

Я пытаюсь установить обои из пути к файлу. Однако это занимает более 10 секунд и приводит к зависанию моего приложения.

Вот код, который я использую:

public void SET_WALLPAPER_FROM_FILE_PATH (String file_path)
{
    Bitmap image_bitmap;
    File   image_file;
    FileInputStream fis;

    try {
        WallpaperManager wallpaper_manager = WallpaperManager.getInstance(m_context);
        image_file                         = new File(file_path);
        fis                                = new FileInputStream(image_file);
        image_bitmap                       = BitmapFactory.decodeStream(fis);

        wallpaper_manager.setBitmap(image_bitmap);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я пробовал использовать:

wallpaper_manager.setStream(fis)

вместо того:

wallpaper_manager.setBitmap(image_bitmap);

как предложено в этом ответе, но не удалось загрузить обои.

Кто-нибудь может направить меня?

Спасибо


person Burak Day    schedule 30.05.2016    source источник
comment
Прежде всего вы должны декодировать изображение в фоновом потоке. И, возможно, вам нужно декодировать изображение с некоторыми параметрами, такими как inSampleSize   -  person Dmitriy Puchkov    schedule 30.05.2016
comment
Есть ли для этого класс или документация?   -  person Burak Day    schedule 30.05.2016


Ответы (1)


Попробуйте использовать AsyncTask, в методе doInBackground напишите что-нибудь вроде этого

public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //The new size we want to scale to
        final int REQUIRED_WIDTH=WIDTH;
        final int REQUIRED_HIGHT=HIGHT;
        //Find the correct scale value. It should be the power of 2.
        int scale=1;
        while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT)
            scale*=2;

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    }
        catch (FileNotFoundException e) {}
    return null;
} 
person Dmitriy Puchkov    schedule 30.05.2016
comment
Я запустил его в ветке, использовал функцию, все вроде идеально, но все равно загрузка обоев занимает 4-5 секунд. Есть ли реальное решение для этого? - person Burak Day; 30.05.2016
comment
Да, все в порядке. Декодирование большого изображения - сложная операция. Так что это зависит от размера - чем меньше требуется размер, тем быстрее будет выполнено - person Dmitriy Puchkov; 30.05.2016