এর চেয়ে ভাল কী: @ সাপ্রেসলিঙ্ক বা @ টার্গেটএপি?


100

আমার অ্যাপটিতে সমস্যাগুলি রয়েছে StrictModeএবং কোড স্নিপেট যুক্ত হয়েছে যা মূলত অক্ষম করে StrictModeHelper। তবে লিন্ট setThreadPolicy()এখনই অভিযোগ করে এবং হয় যোগ করার প্রস্তাব দেয়

@SuppressLint 'NewApi'

অথবা

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

থেকে onCreate()ভিউ ইভেন্ট।

কোন পদ্ধতিটি অগ্রাধিকারযুক্ত .. বা মূলত তারা কি একইভাবে করছে?

উত্তর:


176

আমার অ্যাপে স্ট্রিক্টমোড সম্পর্কিত সমস্যা রয়েছে এবং কোড স্নিপেট যুক্ত হয়েছে যা মূলত স্ট্রাইকডমহেল্পারকে অক্ষম করে

নেটওয়ার্কিং বাগটি ঠিক করুন।

কোন পদ্ধতিটি অগ্রাধিকারযুক্ত .. বা মূলত তারা কি একইভাবে করছে?

@TargetApiএবং @SuppressLintএকই মূল প্রভাব রয়েছে: তারা লিন্ট ত্রুটি দমন করে।

পার্থক্যটি হ'ল @TargetApiপ্যারামিটারের মাধ্যমে আপনি ঘোষণা করেছেন যে আপনি আপনার কোডে কোন এপিআই স্তরটি সম্বোধন করেছেন, যাতে আপনি পরে এপিআই স্তরের উল্লেখ করা থেকে আরও নতুন কিছু উল্লেখ করার পদ্ধতিটি পরিবর্তন করে যদি ত্রুটিটি আবার পপ আপ হতে পারে @TargetApi

উদাহরণস্বরূপ, ধরুন যে, StrictModeআপনার নেটওয়ার্কিং বাগ সম্পর্কে অভিযোগগুলি ব্লক করার পরিবর্তে আপনি AsyncTaskঅ্যান্ড্রয়েডের নতুন সংস্করণগুলিতে সিরিয়ালযুক্ত হওয়ার বিষয়টি নিয়ে কাজ করার চেষ্টা করছেন । নতুন ডিভাইসে থ্রেড পুলে অপ্ট করতে এবং পুরানো ডিভাইসে ডিফল্ট মাল্ট্রিথ্রেড আচরণ ব্যবহার করার জন্য আপনার কোডে এই জাতীয় পদ্ধতি রয়েছে:

  @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, তবে এপিআই লেভেল 11 পর্যন্ত, লিন্ট অভিযোগ করবে না। এই ক্ষেত্রে, যে কাজ করে। যাইহোক, আমি এই পদ্ধতিটি এমন কিছু রেফারেন্সের জন্য সংশোধন করেছি যা এপিআই লেভেল 14 পর্যন্ত যোগ করা হয়নি, তবে লিঙ্ক ত্রুটিটি আবার উপস্থিত হবে, কারণ আমার @TargetApi(11)টীকায় বলা আছে যে আমি কেবলমাত্র এপিআই লেভেল 11 এবং তারপরে নীচে কাজ করার জন্য কোডটি স্থির করেছি , না এপিআই স্তর 14 এবং উপরে নীচে

ব্যবহার করে @SuppressLint('NewApi'), আমার কোড রেফারেন্সগুলি এবং আমার কোড হ্যান্ডেল করার জন্য কী সেট আপ করা হয়েছে তা বিবেচনা না করেই আমি কোনও API স্তরের জন্য লিন্ট ত্রুটি হারাব ।

অতএব, @TargetApiপছন্দসই টীকাটি হ'ল, কারণ এটি আপনাকে বিল্ড সরঞ্জামগুলিকে "ঠিক আছে, আমি এই বিভাগের সমস্যাগুলি ঠিক করেছি" আরও সূক্ষ্ম ধরণের ফ্যাশনে বলার অনুমতি দেয়।


আমি সচেতন যে একটি অ্যাসিঙ্ক পদ্ধতির ব্যবহার করাই পছন্দনীয়, কেবলমাত্র আমার বিশেষ ক্ষেত্রে আমি কার্যনির্বাহী হয়ে থাকব। এই বিশদ এবং খুব বোধগম্য ব্যাখ্যার জন্য ধন্যবাদ - এবং এই সুযোগে, আপনার খুব সহায়ক ওয়েব পৃষ্ঠাগুলির জন্যও ধন্যবাদ যা অ্যান্ড্রয়েড প্রোগ্রামিংয়ের কিছু ধারণা বুঝতে আমাকে অনেক সহায়তা করেছে! আর।
ধনী

9
@ রচি: "কেবলমাত্র আমার বিশেষ ক্ষেত্রে আমি কার্যনির্বাহী হয়ে থাকব" - এটি কোনও ভাল ধারণা নয়। মোবাইল ডিভাইসগুলি মোবাইল। নেটওয়ার্ক সংযোগগুলি বরং অস্থির এবং বিভিন্ন পরিস্থিতিতে উল্লেখযোগ্যভাবে বেশি সময় নিতে পারে (যেমন, দুর্বল সংকেত)। মূল অ্যাপ্লিকেশন থ্রেডে নেটওয়ার্ক I / O সম্পাদন করার অর্থ হল আপনার অ্যাপটি এলোমেলোভাবে ফিল্ডের একটি এএনআরের সাথে ক্রাশ হবে।
কমন্সওয়্যার

2
বাহ, আপনার কোড উদাহরণটি হ'ল সঠিক কোড যা আমি লেখার চেষ্টা করছি! কি কাকতালীয় :)
ইলিয়া কোগান

4
আপনি যদি বিবৃতিতে বিল্ড। VERSION_CODES.HONEYCOMB ব্যবহার করেছেন তবে @ টার্গেটএপি (বিল্ড। ভার্সন_কোডেস.হোনাইয়কোবিবি) ব্যবহার করা কি আরও কম / আরও ধারাবাহিক হবে না?
অলিভার পিয়ারমাইন 10

1
"আমি কেবল কোডটি এপিআই লেভেল ১১ এবং এর নীচে কাজ করতে সংশোধন করেছি, এপিআই স্তর ১৪ এবং নীচে নয় fixed" - আপনি "ওপরে" মানে না?
arekolek
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.