【问题标题】:Asynctask from non-UI thread来自非 UI 线程的 Asynctask
【发布时间】:2018-07-30 15:35:25
【问题描述】:

我使用压缩图像库:https://github.com/zetbaitsu/Compressor。 该库必须运行 UI 线程,但压缩功能在非 Ui 线程内。所以我把这个函数移到了 asynctask 里面。

这是正确的方法吗?您还有其他想法吗?正确使用 asynctask execute() 还是应该使用 executeOnExecutor() 还是不使用 get() 函数?

public static class compressFile extends AsyncTask<Void, File, File> {

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

            File thumbFile = null;

            try {

                thumbFile = new Compressor(MyApplication.getContext())
                        .setMaxWidth(width)
                        .setMaxHeight(height)
                        .setQuality(quality)
                        .setCompressFormat(Bitmap.CompressFormat.JPEG)
                        .compressToFile(new File(path), " " + System.currentTimeMillis());

            } catch (Exception e) {
                Mylog.printStackTrace(TAG + " error", e);
            }

            return thumbFile;
        }

    }

在非 UI 线程中压缩图像使用:

File compressedBigFile = new compressFile().execute().get();

【问题讨论】:

  • 旁注:MyApplication.getContext() 暗示您对应用程序上下文有静态引用,这不是一个好习惯。您应该在 AsyncTask 构造函数中将上下文作为参数传递,并使用弱引用保持它。
  • 好的,谢谢,之后我就照你说的写

标签: android multithreading android-asynctask compression


【解决方案1】:

不,这是不对的。切勿在 UI 线程上使用 AsyncTask.get。这样做会强制 UI 线程等待结果。这与根本不使用线程等效(实际上稍微差一点)。正确的做法是将任何需要结果的代码放在 AsyncTask 的 onPostExecute 中,以便在任务完成时运行它,并在必要时在它处理时放置加载 UI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多