如何将字节数组转换为ui线程的drawable

时间:2016-07-10 18:04:54

标签: java android multithreading android-asynctask

这个问题与我的问题here有关,但这本身就是一个问题,所以在这里, 我如何将一个字节数组转换为可从UI线程中删除,并且从性能角度来看是否有任何意义? 尝试它的方式是作为适配器的一部分,进度条工作,但图像永远不会加载,并在android studio中给我一个错误

继承人如何尝试这样做(我以前从未使用异步任务)

 private class MyAsyncTask extends AsyncTask<Bitmap, Void, Bitmap> {
    private byte[] data;
    private ProgressBar progress;
    private MyViewHolder holder;

    public MyAsyncTask(byte[] data,ProgressBar progress,MyViewHolder holder) {
        this.data = data;
        this.progress = progress;
        this.holder = holder;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progress.setVisibility(View.VISIBLE);
        progress.setIndeterminate(true);
    }
    @Override
    protected Bitmap doInBackground(Bitmap... data) {

        return BitmapFactory.decodeByteArray(this.data, 0, data.length);
    }
    @Override
    protected void onPostExecute(Bitmap response) {
        super.onPostExecute(response);
        {
        Drawable drawable = new BitmapDrawable(response);
        holder.cardImage.setImageDrawable(drawable);
        progress.setVisibility(View.GONE);
        }
    }
}

然后我用这个方法来调用它:

public void startNewAsyncTask(byte[] image,ProgressBar progress,MyViewHolder holder) {
    MyAsyncTask asyncTask = new MyAsyncTask(image,progress,holder);
    asyncTask.execute();
}

我从我的观众那里这样称呼:

startNewAsyncTask(cardmaker.getCardIcon(),holder.progress,holder);

这给了我这个错误:

D/skia: --- SkImageDecoder::Factory returned null

我尝试异步任务之前的工作非常简单,这个;

   Drawable drawable = new BitmapDrawable(Utility.getPhoto(cardmaker.getCardIcon()));
   holder.cardImage.setImageDrawable(drawable);

和那个&#39; Utility.getPhoto&#39;看起来像这样

 public static Bitmap getPhoto(byte[] image) {
    return BitmapFactory.decodeByteArray(image, 0, image.length);
}

这使得编舞者跳过帧并最终使用OutOfMemoryError崩溃我的应用程序,这实际上是我尝试实现此异步任务的重点,所以如果我的理解是根本错误的,请不要犹豫告诉我

非常感谢

1 个答案:

答案 0 :(得分:0)

:此

protected Bitmap doInBackground(Bitmap... data) {

    return BitmapFactory.decodeByteArray(this.data, 0, data.length);
}

应该是

protected Bitmap doInBackground(Bitmap... data) {

    return BitmapFactory.decodeByteArray(this.data, 0, this.data.length);
}

但它没有解决我的内存错误的强调问题,它只是从不同的地方抛出它