显然,我正在开发一个室内定位系统,我想调整使用picasso库从服务器获取的图像的大小,但是我得到一个空指针异常错误,其中说:尝试从字段读取' double com.indooratlas.android.sdk.resources.IALatLng.latitude'在空对象引用。
我知道为什么我得到这个空指针异常,但我没有看到任何其他方法来调整图像大小。 以下是名为Extra_Activity的 ImageViewActivity ,其中不包含完整代码,仅包含相关代码段:
public class Extra_activity extends FragmentActivity
{
private static final float dotRadius = 1.0f;
private static final int MAX_DIMENSION = 2048;
private IALocationManager mIALocationManager;
private IAResourceManager mResourceManager;
private IATask<IAFloorPlan> mPendingAsyncResult;
//private IAFloorPlan mFloorPlan;
private BlueDotView mImageView;
private Target mLoadTarget;
private static final String TAG ="FloorPlanLoader";
private IALatLng latLng;
private IALocationListener mIALocationListener = new IALocationListener()
{
@Override
public void onLocationChanged(IALocation location) {
Log.d(TAG, "location is: " + location.getLatitude() + "," + location.getLongitude());
if (mImageView != null && mImageView.isReady()) {
latLng = new IALatLng(location.getLatitude(), location.getLongitude());
//PointF point = mFloorPlan.coordinateToPoint(latLng);
//mImageView.setDotCenter(point);
//mImageView.postInvalidate();
}
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
};
private IARegion.Listener mRegionListener = new IARegion.Listener()
{
@Override
public void onEnterRegion(IARegion region) {
if (region.getType() == IARegion.TYPE_FLOOR_PLAN) {
String id = region.getId();
Log.d(TAG, "floorPlan changed to " + id);
fetchFloorPlan(id);
}
}
@Override
public void onExitRegion(IARegion region) {
// leaving a previously entered region
}
};
private void showFloorPlanImage(final IAFloorPlan floorPlan) {
final String filePath = floorPlan.getUrl();
if (mLoadTarget == null)
{
mLoadTarget = new Target()
{
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from)
{
Log.d(TAG, "onBitmap loaded with dimensions: " + bitmap.getWidth() + "x"
+ bitmap.getHeight());
mImageView.setImage(ImageSource.bitmap(bitmap.copy(bitmap.getConfig(), true)));
mImageView.setRadius(floorPlan.getMetersToPixels() * dotRadius);
PointF point = floorPlan.coordinateToPoint(latLng);
mImageView.setDotCenter(point);
mImageView.postInvalidate();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
@Override
public void onBitmapFailed(Drawable placeHolderDrawable) {
Toast.makeText(Extra_activity.this, "Failed to load bitmap",
Toast.LENGTH_SHORT).show();
}
};
}
RequestCreator request = Picasso.with(this).load(filePath).rotate(90); //.resize(0,0)
final int bitmapWidth = floorPlan.getBitmapWidth();
final int bitmapHeight = floorPlan.getBitmapHeight();
if (bitmapHeight > MAX_DIMENSION) {
request.resize(0, MAX_DIMENSION);
} else if (bitmapWidth > MAX_DIMENSION) {
request.resize(MAX_DIMENSION, 0);
}
request.into(mLoadTarget);
Log.w(TAG, "showFloorPlanImage: " + filePath);
progressDialog.dismiss();
}
private void fetchFloorPlan(String id) {
cancelPendingNetworkCalls();
final IATask<IAFloorPlan> asyncResult = mResourceManager.fetchFloorPlanWithId(id);
mPendingAsyncResult = asyncResult;
if (mPendingAsyncResult != null) {
mPendingAsyncResult.setCallback(new IAResultCallback<IAFloorPlan>() {
@Override
public void onResult(IAResult<IAFloorPlan> result) {
Log.d(TAG, "fetch floor plan result:" + result);
if (result.isSuccess() && result.getResult() != null)
{
//mFloorPlan = result.getResult();
showFloorPlanImage(result.getResult());
} else {
if (!asyncResult.isCancelled()) {
Toast.makeText(Extra_activity.this,
(result.getError() != null
? "error loading floor plan: " + result.getError()
: "access to floor plan denied"), Toast.LENGTH_LONG)
.show();
}
}
}
}, Looper.getMainLooper());
}
}
private void cancelPendingNetworkCalls() {
if (mPendingAsyncResult != null && !mPendingAsyncResult.isCancelled()) {
mPendingAsyncResult.cancel();
}
}
}
来自logcat的错误消息:
(Extra_activity.java:154)是指 showFloorPlanImage 方法中的 PointF point = floorPlan.coordinateToPoint(latLng); 。 PointF point = floorPlan.coordinateToPoint(latLng); 应该放在onLocationChanged方法中但是,在这段代码中,我不能使用 PointF point = floorPlan.coordinateToPoint(latLng) ; 在该方法中作为变量 floorplan 只能在 showFloorPlanImage 方法中访问。这整个导致空指针异常。
我问了一个类似的问题,我使用了不同的方法(不同的代码),然而,我能够调整图像大小,但蓝点显示在视线之外:&#34; {{3 }}&#34;
什么是正确的解决方案,因为我的方法似乎都没有用?非常感谢你能帮助我解决这个问题。
答案 0 :(得分:0)
我真的不明白你的Nullpointer和图像大小调整之间的关系。但是,你想要实现的只是在我理解正确的情况下调整图像大小。而不是试图调整图像本身,为什么不改变其容器的大小? (这里是ImageView
)。您可以使用getLayoutParams().height
和getLayoutParams().width
或xml(例如此示例)来实现此目的:
<ImageView
android:id="@+id/image"
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/image" />
答案 1 :(得分:0)
很难从不完整的代码片段中分辨出来,但对我来说,看起来你的错误与Picasso或IndoorAtlas无关。您似乎使用our example code作为模板,但使cb1.GetValue(LookUp.LookUpItemsSourceProperty)
成为实例变量。
因此,在latLng
初始化之前,您可以调用(并且显然被调用)您获得NPE的onBitmapLoaded()
。后者在latLng
回调时异步发生(在这种情况下,在您需要它之后)。在使用异步回调构造时,您不能依赖于特定的调用顺序。
祝你好运!