【问题标题】:Android run thread in service every X secondsAndroid每X秒运行一次服务线程
【发布时间】:2011-11-22 16:56:11
【问题描述】:

我想在每 X 秒运行一次的 Android 服务中创建一个线程

我目前正在使用,但 postdelayed 方法似乎真的落后于我的应用程序。

@Override
public int onStartCommand(Intent intent, int flags, int startId){

    super.onStartCommand(intent, flags, startId);

    startRepeatingTask();

    return startId;
}

private final static int INTERVAL = 20000; //20 milliseconds
Handler m_handler = new Handler();

Runnable m_handlerTask = new Runnable()
{
     @Override 
     public void run() {
         // this is bad
          m_handler.postDelayed(m_handlerTask, INTERVAL);
     }
};

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

void stopRepeatingTask()
{
   m_handler.removeCallbacks(m_handlerTask);
   stopSelf();
}

我想做一个这样的新线程:

public void threadRun()
{
    Thread triggerService = new Thread(new Runnable(){
        public void run(){
            Looper.prepare();
            try{
                    //do stuff here?

            }catch(Exception ex){
                    System.out.println("Exception in triggerService Thread -- "+ex);
            }//end catch


        }//end run
    }, "aThread");
    triggerService.start();      

    //perhaps do stuff here with a timer?
    timer1=new Timer();

    timer1.scheduleAtFixedRate(new methodTODOSTUFF(), 0, INTERVAL);
}

我不确定让后台线程以特定间隔运行的最佳方法,感谢您的见解!

【问题讨论】:

    标签: android multithreading timer


    【解决方案1】:

    有许多替代方法可以做到这一点。就个人而言,我更喜欢使用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);
    

    【讨论】:

    【解决方案2】:

    这是我运行重复线程的方式,您会看到它每 1 秒循环一次。我认为这种方法没有滞后。

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

    还有班级:

    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);       
        }
    }
    

    【讨论】:

      【解决方案3】:

      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
          }
      }
      

      AndroidManifest.xml中添加以下代码

      AndroidManifest.xml

      <service android:name=".MyService" android:enabled="true" android:exported="true"></service>
      

      【讨论】:

      • 能否请您解释一下这段代码?
      • 这里的技巧是使用Service并实现一个Timer运行一个TimerTask的时间间隔。我的示例是我每 5 秒吃一次 Toast 和 Time
      【解决方案4】:

      每隔几秒启动一个runnable 就会有一些延迟,不管你怎么切它,不是吗?我不明白为什么 Handler 不能正常工作。

      你可能会遇到一些麻烦,因为你有

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

      相反,您应该使用处理程序并执行以下操作:

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

      (顺便说一句,Java 中的约定是使用驼峰式大小写,而不是蛇形大小写。所以它应该是 mHandler,而不是 m_handler 等。只是告诉你,因为它可能会让你的代码更容易阅读。)

      【讨论】:

      • 我有一种方法,只开始可运行一次,这种方式没有滞后
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2011-12-03
      • 2019-03-09
      • 2021-12-18
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多