在自己的线程中运行连续调用的方法的正确方法?

时间:2015-04-09 08:51:58

标签: android multithreading

我用thread.sleep(100)连续调用methode doSomething()。这发生在UIThread上,因此UIthread没有响应。 Android在单独的线程中运行方法doSomething()或整个someobject的正确方法是什么?

public void loop(){
 while(true){
  someObject.doSomething();
  try {
       Thread.sleep(100);
  } catch (InterruptedException e) {
       e.printStackTrace();
  }
 }
}

现在我正在使用

 new Thread(new Runnable() {
    @Override
    public void run() {
          someObject.doSomething();

    }
 }).start();

这显然会为每次迭代创建一个不同的线程。我不认为这是正确的方法。 Android中的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

 new Thread(new Runnable() {
    @Override
    public void run() {
        while(true){
           try {
               Thread.sleep(100);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           someObject.doSomething();
       }
    }
 }).start();

由于run永远不会返回,所以线程永远不会结束并永远循环。它将大约每100毫秒调用一次doSomething(尽可能接近睡眠,这是不确切的)。

答案 1 :(得分:2)

您可以使用Looper和Handler创建自己的Thread类,每隔100ms发布一次doSomething:

public class MyThread extends Thread{
  private Handler myHandler;

  @Override
  public void run(){
    Looper.prepare();
    myHandler = new Handler();
    myHandler.post(doSomethingRunnable);
  }
  Runnable doSomethingRunnable = new Runnnable{
    doSomething();  //or myHandler.postDelayed() first for greater accuracy, but only if doSomething doesnt take too long
    myHandler.postDelayed(doSomethingRunnable, 100);
  };
  doSomething(){
  thisStuff(thatStuff());
  }
}

答案 2 :(得分:0)

您可以使用AsyncTaskdoInBackground()在后​​台线程上调用,不会阻止UI。这是在后台线程上执行操作的首选方法。

长期运行的任务。您可以使用IntentService并将后台代码放在onHandleIntent

您可以使用基本线程,但可能很难管理。您可以在android here

中阅读有关线程的更多信息