প্রতি X সেকেন্ডে কীভাবে কোনও পদ্ধতি চালানো যায়


114

আমি একটি অ্যান্ড্রয়েড ২.৩.৩ অ্যাপ্লিকেশন বিকাশ করছি এবং প্রতি X সেকেন্ডে আমার একটি পদ্ধতি চালানো দরকার ।

আইওএসে, আমার কাছে এনএসটিমার রয়েছে , তবে অ্যান্ড্রয়েডে আমি কী ব্যবহার করব তা জানি না।

কেউ আমাকে হ্যান্ডলার সুপারিশ করেছেন ; অন্য আমাকে সুপারিশ AlarmManager কিন্তু আমি যা পদ্ধতি তড়কা সাথে উন্নত জানি না NSTimer

এই কোডটি আমি অ্যান্ড্রয়েডে প্রয়োগ করতে চাই:

timer2 = [
    NSTimer scheduledTimerWithTimeInterval:(1.0f/20.0f)
    target:self
    selector:@selector(loopTask)
    userInfo:nil
    repeats:YES
];

timer1 = [
    NSTimer scheduledTimerWithTimeInterval:(1.0f/4.0f)
    target:self
    selector:@selector(isFree)
    userInfo:nil
    repeats:YES
];

আমার কিছু দরকার যা এনটিএসটাইমের মতো কাজ করে ।

আপনি আমাকে কি সুপারিশ করবেন?


1
"সেরা এক" সংজ্ঞা দিন। আপনি কোন উপায়ে এটি সেরা হতে চান?
সাইমন ফারসবার্গ

NSTimer এর সাথে কোন পদ্ধতিটি আরও ভাল ফিট করে তা আমি জানি না।
ভ্যানফ্যানেল

@ ভ্যানফ্যানেল আপনি কতক্ষণ বিরতি চাইছেন?
ফোমাইগুই

আমি কী করার চেষ্টা করছি সে সম্পর্কে বিশদ সহ প্রশ্নটি আপডেট করেছি।
ভ্যানসফ্যানেল

এই প্রশ্ন: স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 24২২২২২6868 / , এটির মতোই এবং এর দুর্দান্ত উত্তরও রয়েছে।
ভ্যানফ্যানেল

উত্তর:


168

এটি আপনাকে কতক্ষণ আলাদা করে ফাংশনটি চালানোর প্রয়োজন তা নির্ভর করে।

যদি এটি => 10 মিনিট হয় তবে আমি অ্যালার্ম ম্যানেজারের সাথে যেতে পারি।

// Some time when you want to run
Date when = new Date(System.currentTimeMillis());    

try{
   Intent someIntent = new Intent(someContext,MyReceiver.class); // intent to be launched

   // note this could be getActivity if you want to launch an activity
   PendingIntent pendingIntent = PendingIntent.getBroadcast(
        context, 
        0, // id, optional
        someIntent, // intent to launch
        PendingIntent.FLAG_CANCEL_CURRENT); // PendintIntent flag

   AlarmManager alarms = (AlarmManager) context.getSystemService(
        Context.ALARM_SERVICE);

   alarms.setRepeating(AlarmManager.RTC_WAKEUP,
        when.getTime(),
        AlarmManager.INTERVAL_FIFTEEN_MINUTES,
        pendingIntent); 

}catch(Exception e){
   e.printStackTrace();
}

এবং তারপরে আপনি ব্রডকাস্ট রিসিভারের মাধ্যমে এই সম্প্রচারগুলি পান। নোট করুন যে এটি আপনার অ্যাপ্লিকেশন ম্যানিফেস্টে বা context.registerReceiver(receiver,filter);পদ্ধতির মাধ্যমে ইথারের নিবন্ধভুক্ত হওয়া দরকার ব্রডকাস্ট ব্রাউজারের আরও তথ্যের জন্য দয়া করে অফিসিয়াল ডক্সটি দেখুন। ব্রডকাস্ট রিসিভার

public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
         //do stuffs
    }
}

যদি এটি = <10 মিনিট → হয় তবে আমি হ্যান্ডলারের সাথে যেতে পারি।

Handler handler = new Handler();
int delay = 1000; //milliseconds

handler.postDelayed(new Runnable(){
    public void run(){
        //do something
        handler.postDelayed(this, delay);
    }
}, delay);

3
সময় বিলম্বের উপর নির্ভর করে কেন বিভিন্ন পরামর্শ?
সাইমন ফারসবার্গ

7
দক্ষতা, অ্যালার্ম ম্যানেজার ডক্সে এটি উল্লেখ করেছে যে এটি কোনও ছোট বিরতি পুনরাবৃত্তিমূলক কাজের জন্য ব্যবহার করা উচিত নয়।
Jug6ernaut

9
@ মধ্যে SimonAndréForsberg AlarmManager ডক্স "নোট:: এটা বলে যে, হ্যান্ডলার হয় সংক্ষিপ্ত এঁটেল পোকা জন্য ব্যবহার করতে preffered এবং আরো effecient পদ্ধতি এলার্ম ম্যানেজার ক্ষেত্রে যেখানে আপনি একটি নির্দিষ্ট সময়ে আপনার অ্যাপ্লিকেশান কোড রান করতে চান জন্য দেয়ার উদ্দেশ্যে করা, এমনকি যদি আপনার অ্যাপ্লিকেশন বর্তমানে চলমান নেই normal সাধারণ সময় নির্ধারণের ক্রিয়াকলাপের জন্য (টিক্স, সময়সীমা ইত্যাদি) হ্যান্ডলার ব্যবহার করা সহজ এবং আরও কার্যকর much "
ফোমাইগুই

তবে, আমার একই ক্রিয়াকলাপে একটি পদ্ধতি চালানো দরকার যা অ্যালার্ম ম্যানেজারটি চালু করেছে। আমি এটা কিভাবে করবো?
ভ্যানসফ্যানেল

2
রানডেবলের মধ্যে থেকে অহমাদালিবলোক আপনি করতে পারেন h.removeCallbacks(this);, অন্যথায় এটি অপসারণ করতে সক্ষম হওয়ার জন্য আপনার রান্নেবলের একটি রেফারেন্স বজায় রাখতে হবে। দ্বিতীয়টি যদি পছন্দ হয় তবে এখানে পোস্ট করা পদ্ধতিটি আপনার সেরা রুট নাও হতে পারে।
Jug6ernaut

101

প্রতি সেকেন্ডের জন্য টাইমার ব্যবহার করুন ...

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        //your method
    }
}, 0, 1000);//put here time 1000 milliseconds=1 second

আমি কী করার চেষ্টা করছি সে সম্পর্কে বিশদ সহ প্রশ্নটি আপডেট করেছি।
ভ্যানফ্যানেল

4
টাইমার ( mopri.de/2010/timertask-bad-do-it-troid-android-way-use-a-handler ) ব্যবহার করবেন না , হ্যান্ডলার বা তফসিলযুক্ত ট্র্যাডপুলএক্সেকিউটার ব্যবহার করুন।
অ্যাপিদেভো

69

আপনি দয়া করে অনারেসিউম () এর মাধ্যমে প্রতি 15 সেকেন্ডে হ্যান্ডলারটি কল করতে চেষ্টা করতে পারেন এবং অনপজ () এর মাধ্যমে ক্রিয়াকলাপটি দৃশ্যমান না হলে এটি বন্ধ করতে পারেন।

Handler handler = new Handler();
Runnable runnable;
int delay = 15*1000; //Delay for 15 seconds.  One second = 1000 milliseconds.


@Override
protected void onResume() {
   //start handler as activity become visible

    handler.postDelayed( runnable = new Runnable() {
        public void run() {
            //do something

            handler.postDelayed(runnable, delay);
        }
    }, delay);

    super.onResume();
}

// If onPause() is not included the threads will double up when you 
// reload the activity 

@Override
protected void onPause() {
    handler.removeCallbacks(runnable); //stop handler when activity not visible
    super.onPause();
}

5
এই আমি খুঁজছিলাম ছিল। পারফেক্ট।
ভাইপার

3
এটাই সঠিক উত্তর!
রিদ্ধি

চিহ্নিত করা! মেইনএ্যাকটিভিটিজগুলি পরীক্ষার জন্য ট্যাবলয়েটে বর্তমান নির্বাচিত ট্যাবটি এই খণ্ডটির সাথে মেলে এবং যদি কাজ বন্ধ না করে - অনপস () ব্যর্থ হয় যখন কোনও নির্বাচিত ট্যাব নির্বাচন করা ট্যাবগুলির উভয় পাশের ট্যাবলয়আউটটি ব্যর্থ হয়
BENN1TH

নিখুঁত। আমি যা খুঁজছিলাম এটিই ছিল :) 1 টি প্রশ্ন, আমি কি অন্য পদ্ধতি থেকে এই পদ্ধতিটি কল করতে পারি? বা আমি যদি এই ক্রিয়াকলাপটি ছড়িয়ে দিই তবে এই বিষয়টি ধ্বংস হয়ে যাবে? যদি আমি একটি স্থিতিশীল হ্যান্ডলার তৈরি করি এবং রানইনেবল হয়। এটা কি সম্ভব?
হাইপারকোডার

17

আপনি যদি আরএক্সজাবার সাথে পরিচিত হন তবে আপনি অবজারভেবল.ইনটারওয়াল () ব্যবহার করতে পারেন যা বেশ ঝরঝরে।

Observable.interval(60, TimeUnits.SECONDS)
          .flatMap(new Function<Long, ObservableSource<String>>() {
                @Override
                public ObservableSource<String> apply(@NonNull Long aLong) throws Exception {
                    return getDataObservable(); //Where you pull your data
                }
            });

এর খারাপ দিকটি হ'ল আপনাকে আপনার ডেটাটিকে ভিন্ন উপায়ে পোলিং করতে হবে। তবে রিঅ্যাকটিভ প্রোগ্রামিং পদ্ধতিতে প্রচুর সুবিধা রয়েছে:

  1. কলব্যাকের মাধ্যমে আপনার ডেটা নিয়ন্ত্রণ করার পরিবর্তে, আপনি সাবস্ক্রাইব করা ডেটার একটি স্ট্রিম তৈরি করেন। এটি "পোলিং ডেটা" যুক্তি এবং "আপনার ডেটার সাথে ইউআই পপুলিং" যুক্তির উদ্বেগকে পৃথক করে যাতে আপনার "ডেটা উত্স" কোড এবং আপনার ইউআই কোডটি মিশ্রিত না হয়।
  2. আরএক্সএন্ড্রয়েডের সাহায্যে আপনি কোডের মাত্র 2 লাইনে থ্রেড পরিচালনা করতে পারেন।

    Observable.interval(60, TimeUnits.SECONDS)
          .flatMap(...) // polling data code
          .subscribeOn(Schedulers.newThread()) // poll data on a background thread
          .observeOn(AndroidSchedulers.mainThread()) // populate UI on main thread
          .subscribe(...); // your UI code

দয়া করে RxJava দেখুন ava এটিতে উচ্চ শিক্ষার বক্ররেখা রয়েছে তবে এটি অ্যান্ড্রয়েডে অ্যাসিঙ্ক্রোনাস কলগুলি পরিচালনা করা এত সহজ এবং ক্লিনার করে তুলবে।


4

কোটলিনের সাহায্যে আমরা এখন এটির জন্য জেনেরিক ফাংশন করতে পারি!

object RepeatHelper {
    fun repeatDelayed(delay: Long, todo: () -> Unit) {
        val handler = Handler()
        handler.postDelayed(object : Runnable {
            override fun run() {
                todo()
                handler.postDelayed(this, delay)
            }
        }, delay)
    }
}

এবং ব্যবহারের জন্য, কেবল করুন:

val delay = 1000L
RepeatHelper.repeatDelayed(delay) {
    myRepeatedFunction()
}

3
    new CountDownTimer(120000, 1000) {

        public void onTick(long millisUntilFinished) {
            txtcounter.setText(" " + millisUntilFinished / 1000);

        }

        public void onFinish() {

            txtcounter.setText(" TimeOut  ");
            Main2Activity.ShowPayment = false;
            EventBus.getDefault().post("go-main");

        }

    }.start();

4
কেবল উত্তর পোস্ট করবেন না Do দয়া করে সম্পাদনা আপনার উত্তর এবং কিছু ব্যাখ্যা যোগ করুন।
শশানথ

2

এখানে আমি ক্রিয়াকলাপ () একটি ক্রিয়াকলাপে পুনরায় বারবার একটি থ্রেড ব্যবহার করেছি, টাইমার কিছু ক্ষেত্রে সবকিছুকে মঞ্জুরি দেয় না থ্রেডই হ'ল সমাধান

     Thread t = new Thread() {
        @Override
        public void run() {
            while (!isInterrupted()) {
                try {
                    Thread.sleep(10000);  //1000ms = 1 sec
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            SharedPreferences mPrefs = getSharedPreferences("sam", MODE_PRIVATE);
                            Gson gson = new Gson();
                            String json = mPrefs.getString("chat_list", "");
                            GelenMesajlar model = gson.fromJson(json, GelenMesajlar.class);
                            String sam = "";

                            ChatAdapter adapter = new ChatAdapter(Chat.this, model.getData());
                            listview.setAdapter(adapter);
                           // listview.setStackFromBottom(true);
                          //  Util.showMessage(Chat.this,"Merhabalar");
                        }
                    });

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };

    t.start();

ক্ষেত্রে এটি প্রয়োজন হলে এটি বন্ধ করা যেতে পারে

@Override
protected void onDestroy() {
    super.onDestroy();
    Thread.interrupted();
    //t.interrupted();
}

দয়া করে পরিস্থিতিটি বর্ণনা করুন যখন আমার উত্তর কাজ করবে না
উমর আতা

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

1

এখানে ব্যবহার করে আপনার সমস্যার জন্য হয়তো সহায়ক উত্তর Rx জাভা & Rx অ্যান্ড্রয়েড

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