来自非UI线程的Asynctask

时间:2018-07-30 15:35:25

标签: android multithreading android-asynctask compression

我使用了压缩图像库:https://github.com/zetbaitsu/Compressor。 该库必须运行UI线程,但compress函数位于非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();

1 个答案:

答案 0 :(得分:1)

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