2015-11-02 68 views
0

我有一个Android手机应用程序,即时通讯尝试检查一个特定的LatLng是否在水中,所以即时通讯使用谷歌静态地图API获取位置图像,然后检查图像是蓝色的。Android piccaso回调前加载

IM使用此代码 -

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; 
    } 

的问题,我想,就是它是不同步的,并且IsWater获得了最后一行和的onSuccess踢之前返回空的结果...

有什么想法?

+0

可能重复[如何使用Picasso加载位图而不使用ImageView?](http://stackoverflow.com/questions/24302431/how-to-load-a-bitmap-with-picasso-without-using -an-imageview) –

回答

0

Picasso默认在后台线程上加载图像。您正在运行的操作是异步的。因此,在调用onSuccess回调之前,它不会阻止您的方法返回result

0

问题是毕加索正在运行异步。在调用方法“isWater”内,所以最终发生的是该方法将返回'false',因为它不是等待毕加索完成,因为它不是在串行执行中。这是由于函数调用的堆栈帧在到达返回语句后从堆栈弹出。

你需要做的是通过使用一个目标以下内容。

// 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 
} 

此代码here拍摄,并且应该为您提供关于如何获取自己的目标而努力的一些见解。

一个Target本质上是一个持有你需要的位图的对象,所以它仍然在内存中。通常用于自定义视图对象,但作为一个字段。这里是文档Target docs

+0

即时尝试使用您建议的代码,但它与目标类有一些问题.. –

0

异步执行是最头疼的事情之一(以及随后的代码)。在我使用的所有JavaScript框架中,网络通信都是在后台线程中完成的。预期的效果是,用户界面线程是空闲的,以防止用户认为事物被锁定。鼠标悬停和工具提示将仍然工作,而后台线程正在将数据从慢速服务器中拖出。

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

我的问题是/仍然基本上是线性思考或功能上,而不是拥抱现代JavaScript的事件驱动性质:将函数传递给异步方法以完全处理处理该响应。不只是返回一个值,而是执行所需值的完整任务。回调函数可以调用其他函数来协助完成该任务,并且可以填写缓存(不管其类型),以便可能需要此数据的其他函数不一定需要等待另一个响应。这常常(对我而言)感觉自我追随的逻辑模式倒退,以解决代码的原始目的。

我已经偶然发现了这种模式翻转很多次,来自C/C++作为我的第一个编程语言。它有时可以帮助避免回调定义的匿名函数模式,并使用名称定义回调函数,然后将该名称传递给异步调用,但是长期而言,这是额外的步骤和额外的内存使用。最大的障碍在于思考Event和EventHandler,而不是函数和数据。

我希望这会有所帮助。