在AsyncTask

时间:2018-08-24 21:25:05

标签: android android-asynctask firebase-storage freeze android-wallpaper

在将我的Firebase存储代码和AsyncTask放入内部时,设置设备墙纸时遇到了一些麻烦。

首先,将这些代码包含在AsyncTask中是否合适?

第二次,成功下载并设置了墙纸,但由于某种原因,AsyncTask在等待关闭进度对话框并显示Toast告诉我墙纸已设置之前没有等待其完成。成功。这里可能出什么问题了?

第三次,即使代码位于AsyncTask的doInBackground()内,也似乎并没有与主线程分开运行,因为在代码被执行时我的应用程序完全死机了运行(并在完成后最终解冻)。

对我有什么见解?我正在学习,很困惑。

以下是供参考的代码。

private class wallpaperTaskHome extends AsyncTask<Void, Void, String> {

    private ProgressDialog dialog = new ProgressDialog(PhotoDetailsActivity.this);

onPreExecute()

    @Override
    protected void onPreExecute() {

        // Progress dialog to show user that the app is working...
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setMessage(getString(R.string.wallpaper_please_wait));
        dialog.show();
    }

doInBackground()

    @Override
    protected String doInBackground(Void... params) {

        // Get Intent data from intent passed from Photos.java class.
        Intent intent = getIntent();
        int position = intent.getExtras().getInt("Image int");

        final StorageReference fullSizeImagesStoragePath = mStorageRef.child("images_full_size/" + position + ".jpg");
        fullSizeImagesStoragePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {

                // Retrieve a WallpaperManager
                final WallpaperManager wallpaperManager = WallpaperManager
                        .getInstance(PhotoDetailsActivity.this);

                Glide
                        .with(PhotoDetailsActivity.this)
                        .asBitmap()
                        .load(uri)
                        .into(new SimpleTarget<Bitmap>() {
                            @Override
                            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                                try {
                                    wallpaperManager.setBitmap(resource, null, true, WallpaperManager.FLAG_SYSTEM);
                                } catch (IOException e) {
                                }
                            }
                        });
            }
        });
        return null;
    }

onPostExecute()

    protected void onPostExecute(String result) {

        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        // Show a Toast message on successful wallpaper change
        showToastWallpaperApplied();
    }
}

感谢您能为我提供的帮助!

编辑:我将doInBackground()方法更改为如下所示,该方法本质上是相同的,但是现在至少它试图异步调用整个代码,因为它提供了我的错误:java.lang.IllegalArgumentException: You must call this method on the main thread

final WallpaperManager wallpaperManager = WallpaperManager
            .getInstance(this);

    Intent intent = getIntent();
    int position = intent.getExtras().getInt("Image int");

    final StorageReference fullSizeImagesStoragePath = mStorageRef.child("images_full_size/" + position + ".jpg");
    GlideApp.with(PhotoDetailsActivity.this)
            .asBitmap()
            .load(fullSizeImagesStoragePath)
            .into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                    try {
                        wallpaperManager.setBitmap(resource, null, true, WallpaperManager.FLAG_SYSTEM);
                    } catch (IOException e) {
                    }
                }
            });

它指向.into(new SimpleTarget<Bitmap>()是只希望在主线程上运行的方法。帮助吗?

1 个答案:

答案 0 :(得分:0)

我的猜测是内部滑行会在UI线程上调用onSuccess,那么即使您将其包装在async任务中,您设置墙纸的任务仍会在ui线程上运行。我建议您检查滑行相关方法的实现。

编辑: 如果是这种情况,那么您还需要将设置的墙纸任务也包装到异步任务中,这将非常麻烦。我的建议是使用Rxjava将这些任务链接在一起,而imo将是一个更好的方法。

编辑: 看了看文档, https://github.com/bumptech/glide/wiki/Loading-and-Caching-on-Background-Threads 它说

  

如果您实际上想与背景上的解码图像进行交互   线程,而不是使用downloadOnly,您可以使用的版本   into()返回FutureTarget

因此,您可以尝试通过异步任务在后台线程上同步加载图像,以避免阻塞ui,但请确保使用应用程序上下文调用它,以避免内存泄漏。

Bitmap myBitmap = Glide.with(applicationContext)
    .load(yourUrl)
    .asBitmap()
    .centerCrop()
    .into(500, 500)
    .get()