मुझे एक फ्रैगमेंट के साथ समस्या है जो नए Google मानचित्र API से SuportMapFragment को एम्बेड करता है। जब मेरा टुकड़ा बनाया जाता है तो यह onResume
विधि में AsyncTask
में कुछ डेटा प्राप्त करता है। हालांकि ऐसा होता है कि MapFragment ऑफ-स्क्रीन बनी हुई है, इसके बजाय एक प्रगति पट्टी प्रदर्शित होती है।GoogleMap.animateCamera() पर GlobalLayout() पर क्रैश क्यों होता है?
जब AsyncTask
पूरा हो गया है, तो मैं मानचित्र दृश्य के onGlobalLayout
ईवेंट के साथ पंजीकरण करता हूं। फिर मैं टुकड़ा प्रदर्शित करता हूं, जिसके परिणामस्वरूप मानचित्र दृश्य दिखाया जाता है और लेआउट किया जाता है। onGlobalLayout
ट्रिगर किया गया है और एनीमेशन शुरू होता है।
यह कुछ समय तक ठीक काम करता है, जब तक कि मैंने लगभग तुरंत पूरा करने के लिए AsyncTask
डेटा एकत्र करने में संचालन को अनुकूलित करना शुरू नहीं किया। अब ऐप अक्सर शुरू होने पर दुर्घटनाग्रस्त हो जाएगा, अक्सर डीबग की तुलना में रिलीज में, यही कारण है कि मुझे लगता है कि मैं रेसिंग हालत से निपट रहा हूं कि मुझे पता नहीं है।
अपवाद पढ़ता है:
मानचित्र आकार नहीं होना चाहिए 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);
धन्यवाद एक बहुत: इस कोड है कि दुर्घटना का कारण लगता है!
धन्यवाद, कि काम करता है। चूंकि नक्शा पूरी तरह से लेआउट कंटेनर भरता है, इसलिए मैं इसके आयामों का उपयोग कर सकता हूं। हालांकि, मेरा सवाल बनी हुई है। चूंकि मैं 'ग्लोबललायआउट()' की प्रतीक्षा कर रहा हूं, मुझे इस समस्या में भाग नहीं लेना चाहिए, क्या मुझे चाहिए? – Chris
नहीं, मुझे ऐसा नहीं लगता है, आपको नक्शे तक ले जाने तक प्रतीक्षा करना होगा। – jgonza73
... या नक्शा सीमाओं के बिना कैमराऑप्शन संपादित करें – jgonza73