Android run thread in service every X seconds

后端 未结 4 1523
醉酒成梦
醉酒成梦 2020-12-05 01:11

I want to create a thread in an Android service that runs every X seconds

I am currently using , but the postdelayed method seems to really lag out my app.

相关标签:
4条回答
  • 2020-12-05 01:32

    There are number of alternative ways to do this. Personally, I prefer to use ScheduledExecutorService:

    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
    
    // This schedule a runnable task every 2 minutes
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
      public void run() {
        doSomethingUseful();
      }
    }, 0, 2, TimeUnit.MINUTES);
    
    0 讨论(0)
  • 2020-12-05 01:34

    Starting a runnable every few seconds is gonna have some lag no matter what way you slice it, no? I don't see why a Handler shouldn't work just fine.

    You might be experiencing some troubles though because you have

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

    Instead, you should use the Handler and do something like:

    void startRepeatingTask()
    {
        m_handler.post(m_handlerTask); 
    }
    

    (As an aside, the convention in Java is to use camel case, not snake case. So it should be mHandler, not m_handler, etc. Just telling you because it might make your code easier to read for some.)

    0 讨论(0)
  • 2020-12-05 01:45

    Here is how I run a repeating thread, as you'll see it loops every 1 second. I see no lag with this method.

    final Thread t = new Thread(new RepeatingThread());
    t.start();
    

    And the class:

    import android.os.Handler;
    
    public class RepeatingThread implements Runnable {
    
        private final Handler mHandler = new Handler();
    
        public RepeatingThread() {
    
        }
    
        @Override
        public void run() { 
            mHandler.postDelayed(this, 1000);       
        }
    }
    
    0 讨论(0)
  • 2020-12-05 01:53

    MyService.java

    public class MyService extends Service {
    
        public static final int notify = 5000;  //interval between two services(Here Service run every 5 seconds)
        int count = 0;  //number of times service is display
        private Handler mHandler = new Handler();   //run on another Thread to avoid crash
        private Timer mTimer = null;    //timer handling
    
        @Override
        public IBinder onBind(Intent intent) {
            throw new UnsupportedOperationException("Not yet implemented");
        }
    
        @Override
        public void onCreate() {
            if (mTimer != null) // Cancel if already existed
                mTimer.cancel();
            else
                mTimer = new Timer();   //recreate new
            mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify);   //Schedule task
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            mTimer.cancel();    //For Cancel Timer
            Toast.makeText(this, "Service is Destroyed", Toast.LENGTH_SHORT).show();
        }
    
        //class TimeDisplay for handling task
        class TimeDisplay extends TimerTask {
            @Override
            public void run() {
                // run on another thread
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        // display toast
                        Toast.makeText(MyService.this, "Service is running", Toast.LENGTH_SHORT).show();
                    }
                });
    
            }
    
        }
    }
    

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            startService(new Intent(this, MyService.class)); //start service which is MyService.java
        }
    }
    

    Add following code in AndroidManifest.xml

    AndroidManifest.xml

    <service android:name=".MyService" android:enabled="true" android:exported="true"></service>
    
    0 讨论(0)
提交回复
热议问题