web-dev-qa-db-ja.com

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

特定の間隔で実行するバックグラウンドスレッドを実行する最良の方法はわかりません。

16
CQM

これを行うには、いくつかの代替方法があります。個人的に、私は 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);
58
yorkw

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

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>
4
Khyati Fatania

数秒ごとにrunnableを開始すると、どのようにスライスしても遅延が発生します。 Handlerがうまく機能しない理由がわかりません。

あなたが持っているのであなたはいくつかのトラブルを経験しているかもしれません

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

代わりに、ハンドラを使用して次のようなことを行う必要があります。

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

(余談ですが、Javaの規則は、ヘビのケースではなく、キャメルケースを使用することです。そのため、m_handlerなどではなく、mHandlerにする必要があります。コードを簡単にするために、いくつか読んでください。)

0
LuxuryMode