新しいGoogle Maps APIのSuportMapFragmentを埋め込んでいるフラグメントに問題があります。私のフラグメントが作成されると、onResume
メソッドで始まるAsyncTask
のデータがフェッチされます。この間MapFragmentはオフスクリーンのままですが、代わりに進捗バーが表示されます。onGlobalLayout()の後にGoogleMap.animateCamera()がクラッシュするのはなぜですか?
AsyncTask
が完成すると、mapViewのonGlobalLayout
イベントで登録します。次に、フラグメントを表示します。その結果、マップビューが表示され、レイアウトされます。 onGlobalLayout
がトリガーされ、アニメーションが開始されます。
データ収集の操作を最適化してから、ほとんど瞬間的に完了するまで、これはかなり時間がかかりました。今では、アプリが起動するとクラッシュすることが多く、リリースよりも頻繁にデバッグされるため、私はここで私が認識していないレース状態に対処していると思うのです。
例外が読み:
地図のサイズは0ですが、ほとんどの場合、レイアウトはまだマップビューのために発生していないではありません。
洞察力があれば幸いです。参考のため
:これはクラッシュを引き起こすように見えるコードです:
// Hide status UI
this.progressBar.setVisibility(View.INVISIBLE);
this.statusTextView.setVisibility(View.INVISIBLE);
// Update state
this.uraDataDownloadFinished = true;
// Schedule map translation to occur when layout is complete
final View mapView = this.mapFragment.getView();
if (mapView.getViewTreeObserver().isAlive())
{
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()
{
@SuppressWarnings("deprecation")
@SuppressLint("NewApi") // We check which build version we are using.
@Override
public void onGlobalLayout()
{
Log.d(TAG, "onGlobalLayout()");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
{
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
else
{
mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
// here we crash
this.map.animateCamera(
CameraUpdateFactory.newLatLngBounds(
LatLngBounds.builder()
.include(topLeft)
.include(topRight)
.include(bottomLeft)
.include(bottomRight)
.build(),
0),
durationMs,
null);
}
});
}
// Show map (which will eventually trigger onGlobalLayout)
this.getFragmentManager().beginTransaction().show(this.mapFragment).commit();
this.mapFragment.getMap().setOnCameraChangeListener(this);
どうもありがとう!
おかげで、。地図はレイアウトコンテナを完全に塗りつぶすので、代わりにその寸法を使用できます。しかし、私の質問は残っています。私は 'onGlobalLayout()'を待っているので、私はこの問題に遭遇するべきではありませんか? – Chris
いいえ、私はそうは思わない、地図がレイアウトされるまで待たなければならない。 – jgonza73
...またはマップ境界なしでCameraOptionsを編集する – jgonza73