使用滑行时,位图返回null

时间:2017-08-04 20:58:44

标签: android bitmap android-glide

我一直试图弄清楚为什么位图在SimpleTarget中给我一个大小值,但在SimpleTarget之外很快就会为null。

df.loc[df.isnull().mean(axis=1).lt(0.8)]

    a   b   c   d   e   f   g   h   i   j
1   NaN 2.0 NaN 2.0 NaN NaN 2.0 NaN NaN 2.0
2   NaN NaN 2.0 NaN 2.0 NaN 2.0 2.0 NaN NaN
4   2.0 2.0 2.0 NaN NaN NaN NaN NaN NaN NaN

编辑:AsyncTask方法。

私有Bitmap getImage(String path){

private Bitmap getImage(String path){

    final Bitmap[] bitmaps = new Bitmap[1];

    Glide.with(getApplicationContext())
            .load(path)
            .asBitmap()
            .into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    bitmaps[0] = resource;
                    Log.v(TAG, "bitmap: " + bitmaps[0].getByteCount());// Returns a value as expected.
                }
            });
        Log.v(TAG, "bitmap2: " + bitmaps[0].getByteCount());// throws a null object reference.
        return bitmaps[0];
    }

编辑:添加了与问题相关的日志。

    final Bitmap[] bitmaps = new Bitmap[1];

    new AsyncTask<Void, Void, Void>() {
        Bitmap tmp;

        @Override
        protected Void doInBackground(Void... params) {
            try {
                tmp = Glide.with(getApplicationContext())
                        .load("http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available.jpg")
                        .asBitmap()
                        .into(-1,-1)
                        .get();
            } catch (final ExecutionException | InterruptedException e) {
                Log.e(TAG, e.getMessage());
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void dummy) {
            if (null != tmp) {
                // The full bitmap should be available here
                bitmaps[0] = tmp;
                Log.v(TAG, "bitmap: " + bitmaps[0].getHeight());
                Log.d(TAG, "Image loaded");
            };
        }
    }.execute();

        Log.v(TAG, "bitmap2: " + bitmaps[0].getHeight());// throws a null object reference.
        return bitmaps[0];
    }

编辑:如果位图未定义为final,则会从内部类中调用。宣布为最终版。

2 个答案:

答案 0 :(得分:1)

您正在创建对参数的引用并在其函数之外使用它,当您离开函数时,位图[0]将为null。

您必须使用以下代码创建位图的副本:
    bitmaps[0] = resource.copy(resource.getConfig(), true);

您应该在onResourceReady()内部使用此内容。

或使用Glide:

bitmaps[0] = Glide.with(getApplicationContext())
        .load(path)
        .asBitmap()
        .into ....
        .get();`

您需要将其包含在asynctask中的函数内并执行它。 请参阅this answer,其中介绍了在后台加载并将位图设置为覆盖onPostExecute()内的imageview。

答案 1 :(得分:0)

我终于让它发挥作用了。 首先,必须在全局工作空间中声明位图。 (就像一个对象)。 第二,Log.v必须在if语句中,因为正在使用Restful客户端服务下载数据库。它并不总能得到预期的数据。

我的解决方案:

编辑:        Bitmap bitmap = null;

with tf.device("/cpu:0"):
    # Define operation here

然而,在前30张图像后执行错误。我猜测它是由于从for循环调用的方法,并导致令人讨厌的错误列表。

private Bitmap getImage(final String path){

    new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            try {
                bitmap = Glide.with(getApplicationContext())
                        .load(path)
                        .asBitmap()
                        .into(-1,-1)
                        .get();
            } catch (final ExecutionException | InterruptedException e) {
                Log.e(TAG, e.getMessage());
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void dummy) {
        }
    }.execute();

    if(bitmap != null) {
        Log.v(TAG, "bitmap2: " + bitmap.getHeight());
    }
        return bitmap;
    }