Điều gì tốt hơn: @SuppressLint hoặc @TargetApi?


100

Tôi gặp sự cố trong ứng dụng của mình liên quan đến StrictModevà đã thêm đoạn mã về cơ bản vô hiệu hóa StrictModeHelper. Tuy nhiên, Lint phàn nàn về setThreadPolicy()hiện tại và đề xuất thêm

@SuppressLint 'NewApi'

hoặc là

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

đến onCreate()sự kiện của chế độ xem.

Phương pháp nào được ưu tiên hơn .. hay về cơ bản chúng đều làm giống nhau?

Câu trả lời:


176

Tôi gặp sự cố trong ứng dụng của mình liên quan đến Chế độ nghiêm ngặt và đã thêm đoạn mã về cơ bản vô hiệu hóa Chế độ nghiêm ngặt

Vui lòng sửa lỗi mạng.

Phương pháp nào được ưu tiên hơn .. hay về cơ bản chúng đều làm giống nhau?

@TargetApi@SuppressLintcó cùng tác dụng cốt lõi: chúng ngăn chặn lỗi Lint.

Sự khác biệt là @TargetApibạn khai báo, thông qua tham số, cấp API nào bạn đã giải quyết trong mã của mình, do đó lỗi có thể xuất hiện trở lại nếu sau đó bạn sửa đổi phương pháp để thử tham chiếu đến thứ gì đó mới hơn cấp API được trích dẫn trong đó @TargetApi.

Ví dụ: giả sử rằng, thay vì chặn các StrictModekhiếu nại về lỗi mạng của bạn, bạn đang cố gắng giải quyết vấn đề AsyncTaskđược đăng nhiều kỳ trên các phiên bản Android mới hơn. Bạn có một phương thức như thế này trong mã của mình để chọn tham gia nhóm luồng trên các thiết bị mới hơn và sử dụng hành vi đa luồng mặc định trên các thiết bị cũ hơn:

  @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)nghĩa là nếu Lint phát hiện ra rằng tôi đang sử dụng thứ gì đó mới hơn của tôi android:minSdkVersion, nhưng lên đến API Cấp 11, Lint sẽ không phàn nàn. Trong trường hợp này, điều đó hoạt động. Tuy nhiên, nếu tôi sửa đổi phương pháp này để một cái gì đó tài liệu tham khảo mà không được thêm vào cho đến khi API cấp 14, sau đó các lỗi Lint sẽ xuất hiện trở lại, bởi vì tôi @TargetApi(11)chú thích nói rằng tôi chỉ cố định mã để làm việc trên API Level 11 và dưới trên, không API Level 14 và dưới trên.

Sử dụng @SuppressLint('NewApi'), tôi sẽ mất lỗi Lint cho bất kỳ cấp API nào , bất kể mã của tôi tham chiếu gì và mã của tôi được thiết lập để xử lý.

Do đó, @TargetApilà chú thích được ưu tiên hơn, vì nó cho phép bạn nói với các công cụ xây dựng "OK, tôi đã khắc phục danh mục vấn đề này" theo cách chi tiết hơn.


Tôi biết rằng việc sử dụng phương pháp Async sẽ thích hợp hơn, chỉ trong trường hợp cụ thể của tôi, tôi sẽ tuân theo cách giải quyết. Cảm ơn vì lời giải thích chi tiết và rất dễ hiểu này - và nhân cơ hội này, cảm ơn các trang web rất hữu ích của bạn đã giúp tôi hiểu rất nhiều về một số khái niệm về lập trình Android! R.
richey

9
@richey: "chỉ trong trường hợp cụ thể của tôi, tôi sẽ tuân theo cách giải quyết khác" - đó không phải là một ý kiến ​​hay. Thiết bị di động là di động. Kết nối mạng khá không ổn định và có thể mất nhiều thời gian hơn trong nhiều trường hợp khác nhau (ví dụ: tín hiệu yếu). Thực hiện I / O mạng trên chuỗi ứng dụng chính có nghĩa là ứng dụng của bạn sẽ gặp sự cố ngẫu nhiên với ANR trong trường.
CommonsWare

2
Chà, ví dụ mã của bạn là mã CHÍNH XÁC mà tôi đang cố viết! Thật là trùng hợp :)
Ilya Kogan

4
Sẽ không gọn gàng / nhất quán hơn khi sử dụng @TargetApi (Build.VERSION_CODES.HONEYCOMB) nếu bạn sử dụng Build.VERSION_CODES.HONEYCOMB trong câu lệnh if?
Oliver Pearmain

1
"rằng tôi chỉ sửa mã để hoạt động trên API Cấp 11 trở xuống, không phải API Cấp 14 trở xuống." - ý bạn không phải là "trở lên"?
arekolek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.