27
กล่องโต้ตอบการขว้าง "ไม่สามารถเพิ่มหน้าต่าง - โทเค็น null ไม่ได้สำหรับแอปพลิเคชัน" ที่มี getApplication () เป็นบริบท
กิจกรรมของฉันพยายามสร้าง AlertDialog ซึ่งต้องใช้บริบทเป็นพารามิเตอร์ ทำงานได้ตามที่คาดไว้หากฉันใช้: AlertDialog.Builder builder = new AlertDialog.Builder(this); อย่างไรก็ตามฉันมักจะใช้ "สิ่งนี้" เป็นบริบทเนื่องจากมีโอกาสเกิดการรั่วไหลของหน่วยความจำเมื่อกิจกรรมถูกทำลายและสร้างใหม่แม้ในช่วงที่เรียบง่ายเช่นการหมุนหน้าจอ จากโพสต์ที่เกี่ยวข้องในบล็อกของนักพัฒนา Android : มีสองวิธีง่าย ๆ ในการหลีกเลี่ยงการรั่วไหลของหน่วยความจำที่เกี่ยวข้องกับบริบท สิ่งที่ชัดเจนที่สุดคือการหลีกเลี่ยงบริบทที่อยู่นอกขอบเขตของตัวเอง ตัวอย่างด้านบนแสดงกรณีของการอ้างอิงแบบสแตติก แต่คลาสภายในและการอ้างอิงโดยนัยของคลาสภายนอกอาจเป็นอันตรายอย่างเท่าเทียมกัน โซลูชันที่สองคือการใช้บริบทของแอปพลิเคชัน บริบทนี้จะมีชีวิตอยู่ตราบใดที่ใบสมัครของคุณยังมีชีวิตอยู่และไม่ได้ขึ้นอยู่กับวงจรชีวิตของกิจกรรม หากคุณวางแผนที่จะรักษาวัตถุที่มีอายุการใช้งานยาวนานซึ่งต้องการบริบทให้จดจำแอปพลิเคชันวัตถุ คุณสามารถรับมันได้อย่างง่ายดายโดยการเรียก Context.getApplicationContext () หรือ Activity.getApplication () แต่สำหรับAlertDialog()ทั้งgetApplicationContext()หรือgetApplication()ยอมรับว่าเป็นบริบทตามที่มันโยนข้อยกเว้น: "ไม่สามารถเพิ่มหน้าต่าง - โทเค็น null ไม่ได้สำหรับแอปพลิเคชัน" ต่อการอ้างอิง: 1 , 2 , 3 , ฯลฯ ดังนั้นสิ่งนี้ควรได้รับการพิจารณาว่าเป็น "บั๊ก" เนื่องจากเราได้รับคำแนะนำให้ใช้อย่างเป็นทางการActivity.getApplication()แต่มันก็ไม่ทำงานตามที่โฆษณาไว้? จิม