0

Glide を使用して画像をダウンロードし、壁紙として設定しようとしています。ダウンロード中に、MaterialDialogs ライブラリを使用してダイアログが表示されますが、画像がほぼ読み込まれると、ダイアログが 1 秒間フリーズします...これは私のコード:

final MaterialDialog downloadDialogA = new MaterialDialog.Builder(context)
                                .content(R.string.downloading_wallpaper)
                                .progress(true, 0)
                                .cancelable(false)
                                .show();

                        Glide.with(context)
                                .load(wallurl)
                                .asBitmap()
                                .into(new SimpleTarget<Bitmap>() {
                                    @Override
                                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                                        downloadDialogA.setContent(context.getString(R.string.setting_wall_title));
                                        if (resource != null) {
                                            WallpaperManager wm = WallpaperManager.getInstance(context);
                                            try {
                                                wm.setBitmap(resource);
                                                Toast.makeText(context, R.string.set_as_wall_done, Toast.LENGTH_LONG).show();
                                                Log.v("Wall", "It worked!");
                                            } catch (IOException e2) {
                                                Toast.makeText(context, e2.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                                                Log.v("Wall", "Error " + e2.getMessage());
                                            }
                                        }
                                        downloadDialogA.dismiss();
                                    }
                                });

他のライブラリを使用して画像をダウンロードしたくないことに注意してください。それは正常に動作します。ダイアログがフリーズしないようにしたいだけです。

前もって感謝します。

4

1 に答える 1

0

これが私がやった方法です。

コードが次の新しい AsyncTask を作成しました。

public class ApplyWallpaper extends AsyncTask<Void, String, Boolean> {
    private Context context;
    private Activity activity;
    private MaterialDialog dialog;
    private Bitmap resource;

    public ApplyWallpaper(Context context, MaterialDialog dialog, Bitmap resource) {
        this.activity = (Activity) context;
        this.context = context;
        this.dialog = dialog;
        this.resource = resource;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        WallpaperManager wm = WallpaperManager.getInstance(context);
        Boolean worked;
        try {
            wm.setBitmap(resource);
            worked = true;
            Log.e("Wall", "It worked!");
        } catch (IOException e2) {
            worked = false;
            Log.e("Wall", "Error " + e2.getMessage());
        }
        return worked;
    }

    @Override
    protected void onPostExecute(Boolean worked) {
        if (worked){
            dialog.dismiss();
            Toast.makeText(context, R.string.set_as_wall_done, Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(context, R.string.error, Toast.LENGTH_LONG).show();
        }
    }
}

次に、リソースの準備ができたら (Glide が提供するコールバック メソッドを使用)、次のように AsyncTask を実行しました。

Glide.with(context)
        .load(wallurl)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(final Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                if (resource != null) {
                    downloadDialogA.setContent(context.getString(R.string.setting_wall_title));
                    new ApplyWallpaper(context, downloadDialogA, resource).execute();
                }
            }
        });

そして問題なく動作しました。

指導してくれたハビエル・サントスに感謝します。

于 2015-07-09T19:50:40.033 に答える