টাইমারটাস্ক বা হ্যান্ডলার


103

ধরা যাক যে আমি প্রতি 10 সেকেন্ডে কিছু ক্রিয়া সম্পাদন করতে চাই এবং প্রয়োজনটি ভিউ আপডেট করার প্রয়োজন হয় না।

প্রশ্নটি হ'ল: এখানে টাইমারটাস্ক সহ টাইমার ব্যবহার করা কি আরও ভাল (আমি আরও দক্ষ এবং কার্যকর বলতে চাই):

final Handler handler = new Handler();

TimerTask timertask = new TimerTask() {
    @Override
    public void run() {
        handler.post(new Runnable() {
            public void run() {
               <some task>
            }
        });
    }
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}

বা পোস্টলিডেড সহ কেবল একটি হ্যান্ডলার

final Handler handler = new Handler(); 
final Runnable r = new Runnable()
{
    public void run() 
    {
        <some task>
    }
};
handler.postDelayed(r, 15000);

এছাড়াও আমি কৃতজ্ঞ হব যদি আপনি ব্যাখ্যা করতে পারেন যে কখন কোন পদ্ধতির ব্যবহার করবেন এবং কেন তাদের মধ্যে একজনের চেয়ে অন্যের চেয়ে দক্ষ (যদি এটি আসলে হয়)।


2
আমি টাইমার টাস্কগুলির অনিয়মিত আচরণ সম্পর্কে অনেকগুলি পোস্ট পড়েছি। আমার পরামর্শ সেগুলি থেকে পরিষ্কার হয়ে যাবে এবং হ্যান্ডলার / পোস্টডিলয়েড পদ্ধতির ব্যবহার করবে।
সাউন্ড কনসেপশন

1
আমি হ্যান্ডলার-পোস্টডেলে পদ্ধতিটি পছন্দ করতাম - আপনার আরও নিয়ন্ত্রণ রয়েছে এবং আপনি এটি ভিতর থেকে নির্ধারণ করেন
মিহাইল


টাইমারটাস্ক একটি ব্যাকগ্রাউন্ড-টাস্ক, তাই আপনি ইউআই আপডেট করতে পারবেন না। শুধু বলছি ...
ইউশা আলেয়ুব

1
জন্য me..thanks কাজ
jyotsna

উত্তর:


95

Handlerচেয়ে ভাল TimerTask

জাভা TimerTaskএবং অ্যান্ড্রয়েড Handlerউভয়ই আপনাকে ব্যাকগ্রাউন্ড থ্রেডগুলিতে বিলম্বিত এবং পুনরাবৃত্তি করা কাজের শিডিয়ুল করার অনুমতি দেয়। তবে সাহিত্যে অভূতপূর্বভাবে অ্যান্ড্রয়েডে Handlerওভার ব্যবহারের পরামর্শ দেওয়া হয়েছেTimerTask (দেখুন এখানে , এখানে , এখানে , এখানে , এখানে এবং এখানে )।

টাইমারটাস্কের সাথে সম্পর্কিত কয়েকটি সমস্যার মধ্যে রয়েছে:

  • ইউআই থ্রেড আপডেট করতে পারে না
  • স্মৃতি ফাঁস
  • অবিশ্বস্ত (সর্বদা কাজ করে না)
  • দীর্ঘ চলমান কাজগুলি পরবর্তী নির্ধারিত ইভেন্টে হস্তক্ষেপ করতে পারে

উদাহরণ

অ্যান্ড্রয়েড উদাহরণ সব ধরণের জন্য ভাল উৎস যে আমি দেখেছি এ CodepathHandlerপুনরাবৃত্তি করার জন্য সেখান থেকে এখানে একটি উদাহরণ a

// Create the Handler object (on the main thread by default)
Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnableCode = new Runnable() {
    @Override
    public void run() {
      // Do something here on the main thread
      Log.d("Handlers", "Called on main thread");
      // Repeat this the same runnable code block again another 2 seconds
      handler.postDelayed(runnableCode, 2000);
    }
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);

সম্পর্কিত


6
@ রিক নো, জিসির উচিত এটি যত্ন নেওয়া উচিত। তবে আপনার বিলম্বিত মৃত্যুদন্ডের জন্য চালানোযোগ্য পোস্টের যত্ন নেওয়া দরকার। উপরের উদাহরণে ব্যবহৃত রান-ইনেবলটি একটি অভ্যন্তরীণ শ্রেণীর উদাহরণ, সুতরাং এটি উপস্থিত শ্রেণীর (যা কোনও ক্রিয়াকলাপ হতে পারে) একটি অন্তর্নিহিত রেফারেন্স ধারণ করে। রান্যানেবল হ্যান্ডলারের সম্পর্কিত লুপের বার্তার কাতারে থাকবে তার পরবর্তী সম্পাদনের সময় পর্যন্ত যা প্রসঙ্গটি অবৈধ হওয়ার পরে এবং এতে থাকা শ্রেণীর উদাহরণটি ফাঁস হতে পারে। আপনি mHandler.removeCallbacks(runnableCode)উপযুক্ত সময়ে (যেমন onStop()কোনও ক্রিয়াকলাপের জন্য) ব্যবহার করে এই জাতীয় রেফারেন্সগুলি সাফ করতে পারেন ।
বিটবাইবিট

7
রেফারেন্স উপস্থাপনের সেরা উপায় !!! (এখানে, এখানে, এখানে, এখানে, এখানে এবং এখানে দেখুন)।
iRavi iVooda

এবং আমি যদি ভিউমোডেলের ভিতরে এটি ব্যবহার করতে চাই তবে কী হবে? সেখানে অ্যান্ড্রয়েড জিনিস না থাকার আদর্শের বিরুদ্ধে নয়?
desgraci

@ দেগ্রগ্রি, আমি একটি ভিউমোডেল ব্যবহার করি নি, তবে ডকুমেন্টেশন থেকে আমি কেবল এটি দেখতে পাচ্ছি যে ভিউমোডেলটি ভিউ হায়ারার্কিতে অ্যাক্সেস করা উচিত নয় বা কার্যকলাপ বা খণ্ডের কোনও রেফারেন্স থাকতে পারে না। আমি সাধারণভাবে "অ্যান্ড্রয়েড জিনিস" রাখা নিষেধ করার কিছুই দেখতে পাচ্ছি না।
সুরগাচ

আজকের হিসাবে সেই রেফারেন্সগুলি আমার কাছে পুরানো এবং যথেষ্ট তথ্যমূলক নয় যা বিবেচনায় নেওয়া উচিত। আপনি যদি আপনার কোডটি খারাপভাবে প্রোগ্রাম করেন তবে 4 টি তালিকাভুক্ত ত্রুটিগুলি কেবল আসল। আপনি যদি পর্যায়ক্রমে পটভূমিতে কিছু চালাতে চান এবং অবশেষে কিছু শর্ত প্রযোজ্য হয় তবে অবশেষে ইউআইটিথ্রেডে কিছু চালাতে চাইলে টাইমার টাস্কগুলি এখনও খুব ভাল পছন্দ।
ডেভিড

18

টাইমার ব্যবহারের কিছু অসুবিধা রয়েছে

এটি কার্য সম্পাদন করতে শুধুমাত্র একক থ্রেড তৈরি করে এবং যদি কোনও টাস্ক চালাতে খুব বেশি সময় নেয়, তবে অন্যান্য কাজগুলি ক্ষতিগ্রস্থ হয়। এটি কার্য এবং থ্রেডের দ্বারা ছড়িয়ে পড়া ব্যতিক্রমগুলি পরিচালনা করে না যা কেবলমাত্র শেষ হয়, যা অন্যান্য নির্ধারিত কার্যগুলিকে প্রভাবিত করে এবং সেগুলি কখনও চালানো হয় না

থেকে অনুলিপি করা:

টাইমারটাস্ক বনাম থ্রেড.স্লিপ বনাম হ্যান্ডলারের পোস্টডিলয়েড - প্রতিটি এন মিলিসেকেন্ডে ফাংশনটি কল করতে সবচেয়ে সঠিক?


6
তাহলে এক শট কাজের জন্য কী? মনে হচ্ছে এটির জন্য টাইমার আরও ভাল কারণ আপনার বার্তাটির সারির ওভারহেড নেই?
মাইকেল

2
আমার ধারণা আমরা কখনই জানতে পারব না
ডেনি

5

গৃহীত উত্তরের কোটলিন সংস্করণ:

val handler = Handler()

val runnableCode = object : Runnable {
    override fun run() {
       Log.d("Handlers", "Called on main thread")
       handler.postDelayed(this, 2000)
    }
}

handler.post(runnableCode)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.