อะไรจะดีไปกว่ากัน: @SuppressLint หรือ @TargetApi


100

ฉันมีปัญหาในแอปของฉันเกี่ยวกับStrictModeและเพิ่มข้อมูลโค้ดที่ปิดใช้งานไฟล์StrictModeHelper. อย่างไรก็ตาม Lint บ่นเกี่ยวกับsetThreadPolicy()ตอนนี้และเสนอให้เพิ่ม

@SuppressLint 'NewApi'

หรือ

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

ถึงonCreate()เหตุการณ์ของการดู

ชอบวิธีไหน.. หรือโดยพื้นฐานแล้วจะทำเหมือนกัน?

คำตอบ:


176

ฉันมีปัญหาในแอปของฉันเกี่ยวกับ StrictMode และได้เพิ่มข้อมูลโค้ดที่ปิดการใช้งาน StrictModeHelper โดยทั่วไป

โปรดแก้ไขข้อบกพร่องของระบบเครือข่าย

ชอบวิธีไหน.. หรือโดยพื้นฐานแล้วจะทำเหมือนกัน?

@TargetApiและ@SuppressLintมีผลกระทบหลักเหมือนกัน: พวกเขาระงับข้อผิดพลาด Lint

ความแตกต่างคือมี@TargetApiคุณประกาศผ่านพารามิเตอร์สิ่งที่ระดับ API ที่คุณได้รับการแก้ไขในรหัสของคุณเพื่อให้ข้อผิดพลาดสามารถปรากฏขึ้นอีกครั้งถ้าคุณต่อมาปรับเปลี่ยนวิธีการที่จะพยายามอ้างอิงสิ่งที่ใหม่กว่าระดับ API @TargetApiที่อ้างถึงใน

ตัวอย่างเช่นสมมติว่าแทนที่จะบล็อกการStrictModeร้องเรียนเกี่ยวกับข้อบกพร่องของระบบเครือข่ายคุณพยายามแก้ไขปัญหาAsyncTaskการทำให้เป็นซีเรียลใน Android เวอร์ชันใหม่กว่า คุณมีวิธีการเช่นนี้ในโค้ดของคุณเพื่อเลือกใช้เธรดพูลบนอุปกรณ์รุ่นใหม่และใช้ลักษณะการทำงานแบบมัลติเธรดเริ่มต้นบนอุปกรณ์รุ่นเก่า:

  @TargetApi(11)
  static public <T> void executeAsyncTask(AsyncTask<T, ?, ?> task,
                                          T... params) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
      task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    }
    else {
      task.execute(params);
    }
  }

มี@TargetApi(11)หมายความว่าถ้าผ้าสำลีตรวจพบว่าฉันกำลังใช้สิ่งที่ใหม่กว่าของฉันandroid:minSdkVersionแต่ถึง API ระดับ 11 ผ้าสำลีจะไม่บ่น ในกรณีนี้ใช้งานได้ อย่างไรก็ตามหากฉันแก้ไขวิธีนี้เพื่ออ้างอิงสิ่งที่ไม่ได้เพิ่มจนกว่า API ระดับ 14 ข้อผิดพลาด Lint จะปรากฏขึ้นอีกครั้งเนื่องจาก@TargetApi(11)คำอธิบายประกอบของฉันบอกว่าฉันแก้ไขโค้ดให้ทำงานบน API ระดับ 11 และต่ำกว่าเท่านั้นไม่ใช่ API ระดับ 14 และด้านล่างดังกล่าวข้างต้น

เมื่อใช้@SuppressLint('NewApi')ฉันจะสูญเสียข้อผิดพลาด Lint สำหรับระดับ API ใด ๆไม่ว่าโค้ดของฉันจะอ้างอิงถึงอะไรและโค้ดของฉันถูกตั้งค่าให้จัดการกับอะไร

ดังนั้นจึง@TargetApiเป็นคำอธิบายประกอบที่ต้องการเนื่องจากช่วยให้คุณสามารถบอกเครื่องมือสร้างว่า "ตกลงฉันแก้ไขปัญหาประเภทนี้แล้ว" ในรูปแบบที่ละเอียดยิ่งขึ้น


ฉันทราบดีว่าการใช้แนวทาง Async จะดีกว่าในกรณีเฉพาะของฉันฉันจะใช้วิธีแก้ปัญหานี้ ขอขอบคุณสำหรับคำอธิบายโดยละเอียดและเข้าใจได้มาก - และในโอกาสนี้ขอขอบคุณสำหรับหน้าเว็บที่เป็นประโยชน์ของคุณซึ่งช่วยให้ฉันเข้าใจแนวคิดบางอย่างของการเขียนโปรแกรม Android ได้มาก! R.
richey

9
@richey: "ในกรณีเฉพาะของฉันฉันจะใช้วิธีแก้ปัญหาชั่วคราว" นั่นไม่ใช่ความคิดที่ดี อุปกรณ์เคลื่อนที่เป็นอุปกรณ์เคลื่อนที่ การเชื่อมต่อเครือข่ายค่อนข้างไม่เสถียรและอาจใช้เวลานานกว่ามากในสถานการณ์ต่างๆ (เช่นสัญญาณอ่อน) การดำเนินการ I / O เครือข่ายบนเธรดแอปพลิเคชันหลักหมายความว่าแอปของคุณจะเกิดข้อขัดข้องแบบสุ่มโดยมี ANR ในฟิลด์
CommonsWare

2
ว้าวตัวอย่างโค้ดของคุณคือโค้ด EXACT ที่ฉันพยายามจะเขียน! ช่างเป็นเรื่องบังเอิญ :)
Ilya Kogan

4
การใช้ @TargetApi (Build.VERSION_CODES.HONEYCOMB) จะดีกว่า / สม่ำเสมอกว่าหรือไม่หากคุณใช้ Build.VERSION_CODES.HONEYCOMB ในคำสั่ง if
Oliver Pearmain

1
"ที่ฉันแก้ไขโค้ดให้ทำงานใน API ระดับ 11 และต่ำกว่าเท่านั้นไม่ใช่ API ระดับ 14 และต่ำกว่า" - คุณไม่ได้หมายถึง "ขึ้นไป" เหรอ?
arekolek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.