একটি সময় বিলম্ব সঙ্গে একটি কাজ পুনরাবৃত্তি?


216

আমার কোডে আমার পরিবর্তনশীল আছে এটি বলুন যে এটি "স্থিতি"।

আমি এই পরিবর্তনশীল মানের উপর নির্ভর করে অ্যাপ্লিকেশনটিতে কিছু পাঠ্য প্রদর্শন করতে চাই। এটি একটি নির্দিষ্ট সময় বিলম্বের সাথে সম্পন্ন করতে হবে।

এটা দেখতে,

  • স্থিতির পরিবর্তনশীল মান পরীক্ষা করুন

  • কিছু পাঠ্য প্রদর্শন করুন

  • 10 সেকেন্ডের জন্য অপেক্ষা করুন

  • স্থিতির পরিবর্তনশীল মান পরীক্ষা করুন

  • কিছু পাঠ্য প্রদর্শন করুন

  • 15 সেকেন্ডের জন্য অপেক্ষা করুন

ইত্যাদি। সময় বিলম্ব হতে পারে এবং পাঠ্য প্রদর্শিত হবে একবার সেট করা হয়।

আমি চেষ্টা করেছি Thread.sleep(time delay)এবং এটি ব্যর্থ হয়েছে। এটি করার আরও ভাল কোনও উপায়?


উত্তর:


448

আপনি ব্যবহার করা উচিত Handler'র postDelayedএই কাজের জন্য ফাংশন। এটি আপনার ইউআই থ্রেডে নির্দিষ্ট বিলম্বের সাথে আপনার কোডটি চালাবে, তাই আপনি ইউআই নিয়ন্ত্রণগুলি আপডেট করতে সক্ষম হবেন।

private int mInterval = 5000; // 5 seconds by default, can be changed later
private Handler mHandler;

@Override
protected void onCreate(Bundle bundle) {

    // your code here

    mHandler = new Handler();
    startRepeatingTask();
}

@Override
public void onDestroy() {
    super.onDestroy();
    stopRepeatingTask();
}

Runnable mStatusChecker = new Runnable() {
    @Override 
    public void run() {
          try {
               updateStatus(); //this function can change value of mInterval.
          } finally {
               // 100% guarantee that this always happens, even if
               // your update method throws an exception
               mHandler.postDelayed(mStatusChecker, mInterval);
          }
    }
};

void startRepeatingTask() {
    mStatusChecker.run(); 
}

void stopRepeatingTask() {
    mHandler.removeCallbacks(mStatusChecker);
}

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

20
দুর্দান্ত প্রোগ্রাম, পুরোপুরি সূক্ষ্ম কাজ করে। তবে স্টার্টরিপিটিং টাস্ককে () অনক্রিট পদ্ধতি / ইউআই থ্রেড থেকে কল করতে হয়েছিল (এটি উপলব্ধি করতে আমার কিছুটা সময় লেগেছিল!) সম্ভবত এই পয়েন্টটি কোথাও উল্লেখ করা যেতে পারে। শুভেচ্ছা সহ
gkris

1
আপনার উত্তর দেওয়া অবিরত। এটি আমাকে আজ একটি গর্ত থেকে বেরিয়ে আসতে সহায়তা করেছে। ধন্যবাদ।
ডিন ব্লেকেলি

অ্যাডাপ্টারের গেটভিউ () পদ্ধতির অভ্যন্তরে পুনরাবৃত্তিযোগ্য কোনও উপায় আছে কি?
toobsco42

1
এখানে যখন আমরা ক্লাস আমদানি করি তখন আমাদের কী আমদানি করা উচিত? android.os.Handler or java.util.logging.Handler?
জে চথুরাঙ্গ

34

আগ্রহী যে কারও কাছে, এখানে এমন একটি শ্রেণি রয়েছে যা আমি ইনজারাকের কোড ব্যবহার করে তৈরি করেছি যা প্রয়োজনীয় সমস্ত কিছু তৈরি করে (আমি এটি ইউআইইউপিডেটার বলেছি কারণ আমি এটি পর্যায়ক্রমে ইউআই আপডেট করতে ব্যবহার করি তবে আপনি এটি পছন্দ মতো কিছু বলতে পারেন):

import android.os.Handler;
/**
 * A class used to perform periodical updates,
 * specified inside a runnable object. An update interval
 * may be specified (otherwise, the class will perform the 
 * update every 2 seconds).
 * 
 * @author Carlos Simões
 */
public class UIUpdater {
        // Create a Handler that uses the Main Looper to run in
        private Handler mHandler = new Handler(Looper.getMainLooper());

        private Runnable mStatusChecker;
        private int UPDATE_INTERVAL = 2000;

        /**
         * Creates an UIUpdater object, that can be used to
         * perform UIUpdates on a specified time interval.
         * 
         * @param uiUpdater A runnable containing the update routine.
         */
        public UIUpdater(final Runnable uiUpdater) {
            mStatusChecker = new Runnable() {
                @Override
                public void run() {
                    // Run the passed runnable
                    uiUpdater.run();
                    // Re-run it after the update interval
                    mHandler.postDelayed(this, UPDATE_INTERVAL);
                }
            };
        }

        /**
         * The same as the default constructor, but specifying the
         * intended update interval.
         * 
         * @param uiUpdater A runnable containing the update routine.
         * @param interval  The interval over which the routine
         *                  should run (milliseconds).
         */
        public UIUpdater(Runnable uiUpdater, int interval){
            UPDATE_INTERVAL = interval;
            this(uiUpdater);
        }

        /**
         * Starts the periodical update routine (mStatusChecker 
         * adds the callback to the handler).
         */
        public synchronized void startUpdates(){
            mStatusChecker.run();
        }

        /**
         * Stops the periodical update routine from running,
         * by removing the callback.
         */
        public synchronized void stopUpdates(){
            mHandler.removeCallbacks(mStatusChecker);
        }
}

তারপরে আপনি আপনার শ্রেণীর অভ্যন্তরে একটি UIUpdater অবজেক্ট তৈরি করতে পারেন এবং এটির মতো ব্যবহার করতে পারেন:

...
mUIUpdater = new UIUpdater(new Runnable() {
         @Override 
         public void run() {
            // do stuff ...
         }
    });

// Start updates
mUIUpdater.startUpdates();

// Stop updates
mUIUpdater.stopUpdates();
...

আপনি যদি এটিকে কোনও অ্যাক্টিভিটি আপডেটার হিসাবে ব্যবহার করতে চান তবে অনারেসিউম () পদ্ধতির ভিতরে স্টার্ট কল এবং অনপস () এর অভ্যন্তরে স্টপ কলটি রাখুন, সুতরাং আপডেটগুলি ক্রিয়াকলাপের দৃশ্যমানতা অনুসারে শুরু হবে এবং থামবে।


1
সম্পাদিত: UPDATE_INTERVAL = interval;হওয়া উচিত আগে this(uiUpdater); মধ্যে UIUpdater(Runnable uiUpdater, int interval)(যেমন মান UPDATE_INTERVALব্যবহার করা হয় এবং প্যারামিটার হিসাবে গৃহীত একটি হতে হবে interval;)। কোডটি যখন সম্ভব হবে তখন প্রায় 80 টিরও বেশি প্রস্থকে এড়িয়ে চলুন (প্রায় সর্বদা;)
মিঃ_আর_মার্স_ডি

5
এই শ্রেণীর বিভিন্ন সমস্যা রয়েছে। প্রথম স্থানে, জিইউআই আপডেট করতে সক্ষম হওয়ার জন্য এটি মূল থ্রেডে ইনস্ট্যান্ট করা উচিত। আপনি হ্যান্ডলার কন্সট্রাকটর প্রধান looper ক্ষণস্থায়ী দ্বারা এই মীমাংসিত হতে পারে: new Handler(Looper.getMainLooper())। দ্বিতীয়ত, এটি আর্গুমেন্টগুলিকে বৈধতা দেয় না, সুতরাং এটি নাল রান্নেবল এবং নেতিবাচক বিরতি গ্রাস করে। অবশেষে, এটি uiUpdater.run()লাইনে ব্যয় করা সময় বিবেচনা করে না , বা সেই পদ্ধতিতে ফেলে দেওয়া সম্ভাব্য ব্যতিক্রমগুলি পরিচালনা করে না। এছাড়াও এটি নিরাপদ থ্রেড না হয়, আপনি করা উচিত startএবং stopসিঙ্ক্রোনাইজ পদ্ধতি।
মিস্টার স্মিথ

2
যুক্তি বৈধতা অংশ না হওয়া পর্যন্ত সম্পাদনা করা, কারণ কোডটি পরীক্ষা করার জন্য আমার কাছে এখানে Elpipse নেই। সাহায্য করার জন্য ধন্যবাদ! এই আপনি কি বোঝাতে চেয়েছিলেন? সিঙ্ক্রোনাইজ করা স্টার্টআপডেটস এবং স্টপআপস আপডেট করুন এবং হ্যান্ডলারের কনট্রাক্টরের ভিতরে একটি লুপার.বিটমেনলুপার () কলটি রাখুন (আমি আশা করি আপনি এটি সরাসরি ক্ষেত্রের ঘোষণা থেকে কল করতে পারেন)
রাভেমির

2
আমি এটি পেয়েছি: error: call to this must be first statement in constructorসম্ভবত একটি সহজ সমাধান আছে।
মিসেসমিলু

4
আমদানি করার জন্য উদ্দীপনা - জাভায় প্রোগ্রামিং যখন হ্যান্ডলার কোথা থেকে আসে তা নির্ধারণ করতে সময় লাগে
রোমান সুসি

23

আমি মনে করি নতুন হটনেস একটি ব্যবহার করা ScheduledThreadPoolExecutor । তাই ভালো:

private final ScheduledThreadPoolExecutor executor_ = 
        new ScheduledThreadPoolExecutor(1);
this.executor_.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
    update();
    }
}, 0L, kPeriod, kTimeUnit);

Executors.newSingleThreadScheduledExecutor()এখানে অন্য বিকল্প হতে পারে।
গুলশান

13

টাইমার ভাল কাজ করে। এখানে, আমি 1.5s এর পরে পাঠ্য অনুসন্ধান করতে এবং ইউআই আপডেট করতে টাইমার ব্যবহার করি। আশা করি এইটি কাজ করবে.

private Timer _timer = new Timer();

_timer.schedule(new TimerTask() {
    @Override
    public void run() {
        // use runOnUiThread(Runnable action)
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                search();
            }
        });
    }
}, timeInterval);

আপনি বিরতি সময় কোথায় রাখলেন?
নাথিয়েল ব্যারোস

1
হাই নাথিয়েল, আমি স্রেফ আমার পোস্টটি আপডেট করেছি, আশা করি এটি সাহায্য করবে! অন্তর্বর্তী সময় হ'ল টাইমআরএসডিউল () এর দ্বিতীয় প্যারামিটার।
কাই ওয়াং

7

এটি করার 3 টি উপায় রয়েছে:

নির্ধারিতথ্রেডপুলএক্সেকিউটার ব্যবহার করুন

আপনার থ্রেডের পুল দরকার নেই বলে কিছুটা ওভারকিলের প্রয়োজন

   //----------------------SCHEDULER-------------------------
    private final ScheduledThreadPoolExecutor executor_ =
            new ScheduledThreadPoolExecutor(1);
     ScheduledFuture<?> schedulerFuture;
   public void  startScheduler() {
       schedulerFuture=  executor_.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                //DO YOUR THINGS
                pageIndexSwitcher.setVisibility(View.GONE);
            }
        }, 0L, 5*MILLI_SEC,  TimeUnit.MILLISECONDS);
    }


    public void  stopScheduler() {
        pageIndexSwitcher.setVisibility(View.VISIBLE);
        schedulerFuture.cancel(false);
        startScheduler();
    }

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

পুরানো অ্যান্ড্রয়েড স্টাইল

    //----------------------TIMER  TASK-------------------------

    private Timer carousalTimer;
    private void startTimer() {
        carousalTimer = new Timer(); // At this line a new Thread will be created
        carousalTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                //DO YOUR THINGS
                pageIndexSwitcher.setVisibility(INVISIBLE);
            }
        }, 0, 5 * MILLI_SEC); // delay
    }

    void stopTimer() {
        carousalTimer.cancel();
    }

হ্যান্ডলার এবং চলমানযোগ্য ব্যবহার করুন

আধুনিক অ্যান্ড্রয়েড স্টাইল

    //----------------------HANDLER-------------------------

    private Handler taskHandler = new android.os.Handler();

    private Runnable repeatativeTaskRunnable = new Runnable() {
        public void run() {
            //DO YOUR THINGS
        }
    };

   void startHandler() {
        taskHandler.postDelayed(repeatativeTaskRunnable, 5 * MILLI_SEC);
    }

    void stopHandler() {
        taskHandler.removeCallbacks(repeatativeTaskRunnable);
    }

কার্যকলাপ / প্রসঙ্গ সহ অ-ফাঁস হ্যান্ডলার

আপনার অভ্যন্তরীণ হ্যান্ডলারের ক্লাস ঘোষণা করুন যা আপনার ক্রিয়াকলাপ / খণ্ড বিভাগে মেমরি ফাঁস করে না

/**
     * Instances of static inner classes do not hold an implicit
     * reference to their outer class.
     */
    private static class NonLeakyHandler extends Handler {
        private final WeakReference<FlashActivity> mActivity;

        public NonLeakyHandler(FlashActivity activity) {
            mActivity = new WeakReference<FlashActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            FlashActivity activity = mActivity.get();
            if (activity != null) {
                // ...
            }
        }
    }

একটি রান রানযোগ্য হিসাবে ঘোষণা করুন যা আপনার ক্রিয়াকলাপ / খণ্ড বিভাগে আপনার পুনরাবৃত্ত কার্য সম্পাদন করবে

   private Runnable repeatativeTaskRunnable = new Runnable() {
        public void run() {
            new Handler(getMainLooper()).post(new Runnable() {
                @Override
                public void run() {

         //DO YOUR THINGS
        }
    };

আপনার ক্রিয়াকলাপ / খণ্ডে হ্যান্ডলার অবজেক্টটি সূচনা করুন (এখানে ফ্ল্যাশএকটিভিটি আমার ক্রিয়াকলাপ শ্রেণি)

//Task Handler
private Handler taskHandler = new NonLeakyHandler(FlashActivity.this);

নির্দিষ্ট সময়ের ব্যবধানের পরে কোনও কাজের পুনরাবৃত্তি করা

টাস্কহ্যান্ডলিআর.পোস্টডিলিয়েড (পুনরাবৃত্তিমূলক টাস্করুনেবল, ডিলে_মিলিস);

কাজের পুনরাবৃত্তি থামাতে

টাস্কহ্যান্ডলার

আপডেট: কোটলিনে:

    //update interval for widget
    override val UPDATE_INTERVAL = 1000L

    //Handler to repeat update
    private val updateWidgetHandler = Handler()

    //runnable to update widget
    private var updateWidgetRunnable: Runnable = Runnable {
        run {
            //Update UI
            updateWidget()
            // Re-run it after the update interval
            updateWidgetHandler.postDelayed(updateWidgetRunnable, UPDATE_INTERVAL)
        }

    }

 // SATART updating in foreground
 override fun onResume() {
        super.onResume()
        updateWidgetHandler.postDelayed(updateWidgetRunnable, UPDATE_INTERVAL)
    }


    // REMOVE callback if app in background
    override fun onPause() {
        super.onPause()
        updateWidgetHandler.removeCallbacks(updateWidgetRunnable);
    }

6

টাইমার আপনার কাজ করার আরেকটি উপায় runOnUiThreadতবে আপনি যদি ইউআইয়ের সাথে কাজ করছেন তবে যুক্ত করতে ভুলবেন না ।

    import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {

 CheckBox optSingleShot;
 Button btnStart, btnCancel;
 TextView textCounter;

 Timer timer;
 MyTimerTask myTimerTask;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  optSingleShot = (CheckBox)findViewById(R.id.singleshot);
  btnStart = (Button)findViewById(R.id.start);
  btnCancel = (Button)findViewById(R.id.cancel);
  textCounter = (TextView)findViewById(R.id.counter);

  btnStart.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View arg0) {

    if(timer != null){
     timer.cancel();
    }

    //re-schedule timer here
    //otherwise, IllegalStateException of
    //"TimerTask is scheduled already" 
    //will be thrown
    timer = new Timer();
    myTimerTask = new MyTimerTask();

    if(optSingleShot.isChecked()){
     //singleshot delay 1000 ms
     timer.schedule(myTimerTask, 1000);
    }else{
     //delay 1000ms, repeat in 5000ms
     timer.schedule(myTimerTask, 1000, 5000);
    }
   }});

  btnCancel.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    if (timer!=null){
     timer.cancel();
     timer = null;
    }
   }
  });

 }

 class MyTimerTask extends TimerTask {

  @Override
  public void run() {
   Calendar calendar = Calendar.getInstance();
   SimpleDateFormat simpleDateFormat = 
     new SimpleDateFormat("dd:MMMM:yyyy HH:mm:ss a");
   final String strDate = simpleDateFormat.format(calendar.getTime());

   runOnUiThread(new Runnable(){

    @Override
    public void run() {
     textCounter.setText(strDate);
    }});
  }

 }

}

এবং এক্সএমএল হ'ল ...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:autoLink="web"
    android:text="http://android-er.blogspot.com/"
    android:textStyle="bold" />
<CheckBox 
    android:id="@+id/singleshot"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Single Shot"/>

কাউন্টডাউনটাইমার ব্যবহারের অন্য উপায়

new CountDownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();

ভবিষ্যতে এক সময় অবধি কাউন্টডাউন শিডিয়ুল করুন, পাশাপাশি অন্তরগুলিতে নিয়মিত বিজ্ঞপ্তি সহ। একটি পাঠ্য ক্ষেত্রে 30 সেকেন্ডের কাউন্টডাউন দেখানোর উদাহরণ:

বিস্তারিত জানার জন্য


1
হ্যান্ডলারটি টাইমারের চেয়ে বেশি পছন্দ করা হয়। দেখুন টাইমার বনাম হ্যান্ডলার
Suragch

4

এটি কাজ করে উদাহরণ অনুসরণ করার চেষ্টা করুন !!!

[হ্যান্ডলার] অনক্রিট () পদ্ধতিতে ব্যবহার করুন যা পোস্টডলেড () পদ্ধতিটি ব্যবহার করে যা রান্নেবলকে বার্তা কাতারে যুক্ত করার জন্য নির্দিষ্ট সময় ব্যয় করার পরে নির্দিষ্ট উদাহরণে চালিত হওয়ার পরে চালানো হয়। 1

এই কোডটি দেখুন:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
    //------------------
    //------------------
    android.os.Handler customHandler = new android.os.Handler();
            customHandler.postDelayed(updateTimerThread, 0);
}

private Runnable updateTimerThread = new Runnable()
{
        public void run()
        {
            //write here whaterver you want to repeat
            customHandler.postDelayed(this, 1000);
        }
};



4

উপরে বিষয়ে পোস্টে ভিত্তি করে ScheduledThreadPoolExecutor , আমি একটি ইউটিলিটি নিয়ে এসেছেন যে আমার চাহিদা (ক পদ্ধতি প্রতি 3 সেকেন্ড আগুন চেয়েছিলেন) উপযুক্ত:

class MyActivity {
    private ScheduledThreadPoolExecutor mDialogDaemon;

    private void initDebugButtons() {
        Button btnSpawnDialogs = (Button)findViewById(R.id.btn_spawn_dialogs);
        btnSpawnDialogs.setVisibility(View.VISIBLE);
        btnSpawnDialogs.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                spawnDialogs();
            }
        });
    }

    private void spawnDialogs() {
        if (mDialogDaemon != null) {
            mDialogDaemon.shutdown();
            mDialogDaemon = null;
        }
        mDialogDaemon = new ScheduledThreadPoolExecutor(1);
        // This process will execute immediately, then execute every 3 seconds.
        mDialogDaemon.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // Do something worthwhile
                    }
                });
            }
        }, 0L, 3000L, TimeUnit.MILLISECONDS);
    }
}

4

আমার ক্ষেত্রে, এই শর্তগুলির মধ্যে একটি যদি সত্য হয় তবে আমাকে একটি প্রক্রিয়া চালাতে হয়েছিল: যদি পূর্ববর্তী প্রক্রিয়াটি সম্পন্ন হয় বা 5 সেকেন্ড ইতিমধ্যে কেটে যায়। সুতরাং, আমি নিম্নলিখিতগুলি করেছি এবং বেশ ভাল কাজ করেছি:

private Runnable mStatusChecker;
private Handler mHandler;

class {
method() {
  mStatusChecker = new Runnable() {
            int times = 0;
            @Override
            public void run() {
                if (times < 5) {
                    if (process1.isRead()) {
                        executeProcess2();
                    } else {
                        times++;
                        mHandler.postDelayed(mStatusChecker, 1000);
                    }
                } else {
                    executeProcess2();
                }
            }
        };

        mHandler = new Handler();
        startRepeatingTask();
}

    void startRepeatingTask() {
       mStatusChecker.run();
    }

    void stopRepeatingTask() {
        mHandler.removeCallbacks(mStatusChecker);
    }


}

প্রসেস 1 পড়লে এটি প্রসেস 2 চালায়। যদি তা না হয় তবে এটি পরিবর্তনশীল সময়গুলিকে বৃদ্ধি করে এবং হ্যান্ডলারটিকে এক সেকেন্ডের পরে কার্যকর করা যায়। প্রসেস 1 পড়া বা বার 5 না হওয়া পর্যন্ত এটি একটি লুপ বজায় রাখে যখন সময় 5 হয় তখন এর অর্থ 5 সেকেন্ড অতিক্রান্ত হয় এবং প্রতিটি সেকেন্ডে, প্রসেস 1.isRead () এর ক্লজটি কার্যকর করা হয়।


1

কোটলিন এবং এর কর্টিন ব্যবহার করা একেবারেই সহজ, প্রথমে আপনার ক্লাসে একটি চাকরি ঘোষণা করুন (আপনার ভিউমোডেলে আরও ভাল):

private var repeatableJob: Job? = null

তারপরে আপনি যখন এটি তৈরি করতে এবং শুরু করতে চান তখন এটি করুন:

repeatableJob = viewModelScope.launch {
    while (isActive) {
         delay(5_000)
         loadAlbums(iImageAPI, titleHeader, true)
    }
}
repeatableJob?.start()

এবং যদি আপনি এটি শেষ করতে চান:

repeatableJob?.cancel()

পিএস: viewModelScopeকেবলমাত্র দেখা মডেলগুলিতে উপলভ্য, আপনি অন্যান্য Coroutine স্কোপ যেমন ব্যবহার করতে পারেনwithContext(Dispatchers.IO)

আরও তথ্য: এখানে


0

কোটলিন ব্যবহার করা লোকের জন্য, ইনজারকের উত্তর কার্যকর হবে না , আইডিইতে ভেরিয়েবলটি আরম্ভ করার প্রয়োজন হবে, সুতরাং postDelayedঅভ্যন্তরের অভ্যন্তরটি ব্যবহার না করে Runnable, আমরা এটি একটি পৃথক পদ্ধতিতে ব্যবহার করব।

  • Runnableএই মত আপনার আরম্ভ করুন :

    private var myRunnable = Runnable {
        //Do some work
        //Magic happens here ↓
        runDelayedHandler(1000)   }
  • আপনার runDelayedHandlerপদ্ধতিটি এভাবে শুরু করুন:

     private fun runDelayedHandler(timeToWait : Long) {
        if (!keepRunning) {
            //Stop your handler
            handler.removeCallbacksAndMessages(null)
            //Do something here, this acts like onHandlerStop
        }
        else {
            //Keep it running
            handler.postDelayed(myRunnable, timeToWait)
        }
    }
  • আপনি দেখতে পাচ্ছেন, এই পদ্ধতির সাহায্যে আপনি keepRunningকার্যকালীন জীবনযাত্রা নিয়ন্ত্রণ করতে সক্ষম হবেন, আবেদনের সময়কালে ট্র্যাক রাখা এবং এটি পরিবর্তন করা আপনার পক্ষে কাজ করবে।

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