gpt4 book ai didi

java - Android - EBADF(错误文件编号)OnClickInfoMarker

转载 作者:行者123 更新时间:2023-11-30 08:56:30 27 4
gpt4 key购买 nike

我已经搜索过相关问题,但没有找到。我创建了一个显示图片、名称和地址的 InfoWindowMarker。然后我创建 OnInfoWindowClickListener,它将显示所选标记的纬度和经度。但是,当我单击信息窗口时,我收到了这条错误消息。

日志:

com.xxxxxxxx.xxxxxxxxxx E/Zygote﹕ Zygote: error closing descriptor libcore.io.ErrnoException: close failed: EBADF (Bad file number) at libcore.io.Posix.close(Native Method) at libcore.io.BlockGuardOs.close(BlockGuardOs.java:75) at com.android.internal.os.ZygoteInit.closeServerSocket(ZygoteInit.java:221) at com.android.internal.os.ZygoteConnection.handleChildProc(ZygoteConnection.java:879) at com.android.internal.os.ZygoteConnection.runOnce(ZygoteConnection.java:242) at com.android.internal.os.ZygoteInit.runSelectLoop(ZygoteInit.java:713) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:649) at dalvik.system.NativeStart.main(Native Method)

信息窗口适配器:

public GoogleMap.InfoWindowAdapter CustomMarkerInfo = new GoogleMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
ViewGroup viewGroup = (ViewGroup)getLayoutInflater().inflate(R.layout.custom_info_window, null);
ImageView ivRow = (ImageView)viewGroup.findViewById(R.id.ivRowImage);
TextView locationName = (TextView)viewGroup.findViewById(R.id.tvRowTitle);
TextView locationAddress = (TextView)viewGroup.findViewById(R.id.tvRowTitle2);
Bitmap locationImage;

locationName.setText(marker.getTitle());
locationAddress.setText(marker.getSnippet());
URL imageURL;
try {
imageURL = new URL(markerInfo.get(marker.getId()));
locationImage = BitmapFactory.decodeStream(imageURL.openConnection().getInputStream());
ivRow.setImageBitmap(locationImage);
}catch (Exception e){
e.printStackTrace();
}
return viewGroup;
}

@Override
public View getInfoContents(Marker marker) {return null;}
};

OnInfoWindowClickListener:

 private GoogleMap.OnInfoWindowClickListener onInfoWindowClickListener = new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
LatLng myLatLng = myLatLng();
Toast.makeText(getApplicationContext(),myLatLng.toString(),Toast.LENGTH_LONG).show();
}
};

private final LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}

@Override
public void onProviderEnabled(String provider) {}

@Override
public void onProviderDisabled(String provider) {}

@Override
public void onLocationChanged(Location newLocation) {

}
};

private LatLng myLatLng(){
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
String provider;
Location location;
LatLng myLatLng = null;

if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
provider = LocationManager.GPS_PROVIDER;
Toast.makeText(getApplicationContext(),"GPS tidak aktif.",Toast.LENGTH_LONG).show();
}else if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
provider = LocationManager.NETWORK_PROVIDER;
}else{
provider = LocationManager.PASSIVE_PROVIDER;
}


if(locationManager.getLastKnownLocation(provider) == null){
locationManager.requestLocationUpdates(provider,2000,10,locationListener);
location = locationManager.getLastKnownLocation(provider);
if(location == null){
Toast.makeText(getApplicationContext(),"Tidak dapat menemukan lokasi saat ini, coba lagi.",Toast.LENGTH_LONG).show();
}else{
location = locationManager.getLastKnownLocation(provider);
myLatLng = new LatLng(location.getLatitude(),location.getLongitude());
}
}else{
location = locationManager.getLastKnownLocation(provider);
myLatLng = new LatLng(location.getLatitude(),location.getLongitude());
}
return myLatLng == null ? myLatLng() : myLatLng;
}

感谢任何解决方案。

更新:从加载的 JSON 创建的标记。如果它可能会导致此问题。

最佳答案

这可能是线程问题。您的 viewGroup 在您的图像从 URL 加载之前返回。一个简单的解决方法是使用第三方图片加载库Picasso

示例代码:

 ImageView imageView = (ImageView)myContentsView.findViewById(R.id.ivRowImage);
if (not_first_time_showing_info_window) {
Picasso.with(getApplicationContext()).load("YOUR_IMG_URL").into(imageView);
} else { // if it's the first time, load the image with the callback set
not_first_time_showing_info_window=true;
Picasso.with(getApplicationContext()).load("YOUR_IMG_URL").into(imageView,new InfoWindowRefresher(marker));
}

然后你可以有一个私有(private)的帮助方法来确保在第一次点击时显示异步:

 private class InfoWindowRefresher implements Callback {
private Marker markerToRefresh;

private InfoWindowRefresher(Marker markerToRefresh) {
this.markerToRefresh = markerToRefresh;
}

@Override
public void onSuccess() {
markerToRefresh.showInfoWindow();
}

@Override
public void onError() {}
}

您可以引用此 GitHub 页面以了解完整实现:​​https://github.com/jbj88817/GoogleMap-InfoWindow-android/blob/master/app/src/main/java/com/bjiang/map_ex/MainActivity.java

如果你真的想用 ImageLoader 来做,你可以看看这篇文章:http://androidfreakers.blogspot.com/2013/08/display-custom-info-window-with.html(但相比使用 Picasso 从 URL 加载更复杂)

关于java - Android - EBADF(错误文件编号)OnClickInfoMarker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28581178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com