加载前返回Android piccaso回调
我有一个安卓手机应用程序,我试图检查一个特定的平台是否在水上,所以我使用谷歌静态地图api获取位置的图像,然后检查图像是否为蓝色 我正在使用这个代码-加载前返回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
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++。它有时可以帮助避免回调定义的匿名函数模式,用名称定义回调函数,然后将名称传递给异步调用,但从长远来看,这是额外的步骤和额外的内存使用。最大的障碍是从事件和事件处理程序的角度思考,而不是从函数和数据的角度思考
我希望这能有所帮助。我可能会重复使用您建议的代码,但目标类存在一些问题。。