Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加载前返回Android piccaso回调_Android_Callback_Picasso - Fatal编程技术网

加载前返回Android piccaso回调

加载前返回Android piccaso回调,android,callback,picasso,Android,Callback,Picasso,我有一个安卓手机应用程序,我试图检查一个特定的平台是否在水上,所以我使用谷歌静态地图api获取位置的图像,然后检查图像是否为蓝色 我正在使用这个代码- private boolean result; public boolean IsWater(LatLng position) { imageView = (ImageView) this.findViewById(R.id.imageView); checkText= (TextView) thi

我有一个安卓手机应用程序,我试图检查一个特定的平台是否在水上,所以我使用谷歌静态地图api获取位置的图像,然后检查图像是否为蓝色

我正在使用这个代码-

private boolean result;
    public boolean IsWater(LatLng position)
    {
        imageView = (ImageView) this.findViewById(R.id.imageView);
        checkText= (TextView) this.findViewById(R.id.checkText);
        String lati = Double.toString(position.latitude);
        String longi = Double.toString(position.longitude);
        String url = "http://maps.googleapis.com/maps/api/staticmap?center="+lati+"," + longi + "&zoom=20&size=1x1&style=element:labels%7Cvisibility:off&style=element:geometry.stroke%7Cvisibility:off";
        Picasso.with(MainActivity.this).load(url)
                .into(imageView, new com.squareup.picasso.Callback() {
                    @Override
                    public void onSuccess() {
                        Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
                        int pixel = bitmap.getPixel(0, 0);
                        int blueValue = Color.blue(pixel);
                        if(blueValue>250)
                        result =true;
                    }

                    @Override
                    public void onError() {
                        result =false;
                    }
                });
        return result;
    }
我认为,问题是它没有同步,在onSuccess开始之前,IsWater到达最后一行并返回null作为结果


有什么想法吗?

毕加索默认将图像加载到背景线程中。您正在运行的操作是异步的。因此,在调用
onSuccess
回调之前,它不会阻止方法返回
result

问题在于毕加索正在异步运行。在调用方法“isWater”中,结果是该方法将返回“false”,因为它不是在串行执行中,而不是等待毕加索完成。这是因为函数调用的堆栈帧在到达return语句后会弹出堆栈

您需要通过使用目标执行以下操作

// make sure to set Target as strong reference
private Target loadtarget;


public void loadBitmap(String url) {

    if (loadtarget == null){
        loadtarget = new Target() {

            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                // do something with the Bitmap
                handleLoadedBitmap(bitmap);
            }

            @Override
            public void onBitmapFailed() {

            }
        };
    }

    Picasso.with(this).load(url).into(loadtarget);
}

public void handleLoadedBitmap(Bitmap b) {
    // do something here
}
这段代码取自,应该可以让您了解如何让它为您的目标工作


目标本质上是一个对象,它保存您需要的位图,因此它仍在内存中。通常作为字段用于自定义视图对象。下面是文档

异步执行是最难理解的事情之一(随后是代码)。在我使用的所有JavaScript框架中,网络通信都是在后台线程中完成的。预期的效果是用户界面线程可以自由使用,以避免用户认为事情被锁定。鼠标悬停和工具提示仍然有效,而后台线程正在将数据从缓慢的服务器中拖出

另一方面,代码模式的形状并不是很好

我的问题是/仍然基本上是线性地或功能性地思考,而不是接受现代JavaScript的事件驱动本质:将函数传递给异步方法以完全处理该响应。不仅返回一个值,还要执行该值所需的全部任务。回调函数可以调用其他函数来帮助完成该任务,并且可以填充缓存(任何类型),以便可能需要该数据的其他函数不必等待另一个响应。这通常(对我来说)与我为解决代码的原始目的而遵循的逻辑模式相反

我曾多次偶然发现这种模式翻转,它来自我的第一种编程语言C/C++。它有时可以帮助避免回调定义的匿名函数模式,用名称定义回调函数,然后将名称传递给异步调用,但从长远来看,这是额外的步骤和额外的内存使用。最大的障碍是从事件和事件处理程序的角度思考,而不是从函数和数据的角度思考


我希望这能有所帮助。

我可能会重复使用您建议的代码,但目标类存在一些问题。。