Java 在我的代码中添加计时器

Java 在我的代码中添加计时器,java,android,timer,draw,Java,Android,Timer,Draw,我想添加一个计时器,在计时器的每一个滴答声(1秒)上,都会导致行刷新。如何在代码中使用计时器 以下是我的代码: LineRefresh.java: package LineRefresh.xyz.com; import java.util.Timer; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; public class LineRefresh extends Ac

我想添加一个计时器,在计时器的每一个滴答声(1秒)上,都会导致行刷新。如何在代码中使用计时器

以下是我的代码:

LineRefresh.java

package LineRefresh.xyz.com;

import java.util.Timer;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;

public class LineRefresh extends Activity {
DrawView drawView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    drawView = new DrawView(this);
    drawView.setBackgroundColor(Color.WHITE);
    setContentView(drawView);
}
package LineRefresh.xyz.com;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class DrawView extends View {
Paint paint = new Paint();

public DrawView(Context context) {
    super(context);

}

@Override
public void onDraw(Canvas canvas) {
 paint.setColor(Color.BLACK);
    canvas.drawLine(50, 200, 270, 200, paint);
}

}
}

DrawView.java

package LineRefresh.xyz.com;

import java.util.Timer;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;

public class LineRefresh extends Activity {
DrawView drawView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    drawView = new DrawView(this);
    drawView.setBackgroundColor(Color.WHITE);
    setContentView(drawView);
}
package LineRefresh.xyz.com;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class DrawView extends View {
Paint paint = new Paint();

public DrawView(Context context) {
    super(context);

}

@Override
public void onDraw(Canvas canvas) {
 paint.setColor(Color.BLACK);
    canvas.drawLine(50, 200, 270, 200, paint);
}

}

您可以让线程休眠1秒:

Thread.sleep(1000); //1000 milliseconds = 1 second
如果您正在使用Swing,最好使用Swing timer


在您的情况下,也许您应该使用计时器

您可以让线程睡眠1秒:

Thread.sleep(1000); //1000 milliseconds = 1 second
如果您正在使用Swing,最好使用Swing timer


在您的情况下,也许您应该使用计时器:

另一种方法是使用处理程序

mHandler = new Handler(new Handler.Callback()
{
    @Override
    public boolean handleMessage(Message msg)
    {
        if(msg.what == REFRESH)
        {
            // TODO Refresh Code

            return true;
        }

        return false;
    }
});

mHandler.sendEmptyMessageDelayed(REFRESH, mMilliSecondsToRefresh);
然后,当您希望它停止时(这也应该进入onStop(),这样当您的应用程序未激活时,它不会在后台继续):


另一种方法是使用处理程序

mHandler = new Handler(new Handler.Callback()
{
    @Override
    public boolean handleMessage(Message msg)
    {
        if(msg.what == REFRESH)
        {
            // TODO Refresh Code

            return true;
        }

        return false;
    }
});

mHandler.sendEmptyMessageDelayed(REFRESH, mMilliSecondsToRefresh);
然后,当您希望它停止时(这也应该进入onStop(),这样当您的应用程序未激活时,它不会在后台继续):


以下是Java的Timertask解决方案:

Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                hereYourMethod();
                }
            }
        };
        timer.schedule(task, 1000,1000);// (the task, when to start, when to repeat)

以下是Java的Timertask解决方案:

Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                hereYourMethod();
                }
            }
        };
        timer.schedule(task, 1000,1000);// (the task, when to start, when to repeat)

另一种方法是:

Handler updateHandler;

@Override
public void onCreateBundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  updateHandler = new Handler();
  // Do this first after 1 second
  updateHandler.postDelayed(RecurringTask, 1000);
}

Runnable RecurringTask = new Runnable() {
  public void run() {
    // Do whatever you want

    // Call this method again every 30 seconds
    updateHandler.postDelayed(this, 30000);
  }
};

我在使用Timer/TimerTask解决方案封送到UI线程时遇到了一些问题,因此这里有另一个解决方案最终对我有效

另一种方法是:

Handler updateHandler;

@Override
public void onCreateBundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  updateHandler = new Handler();
  // Do this first after 1 second
  updateHandler.postDelayed(RecurringTask, 1000);
}

Runnable RecurringTask = new Runnable() {
  public void run() {
    // Do whatever you want

    // Call this method again every 30 seconds
    updateHandler.postDelayed(this, 30000);
  }
};

我在使用Timer/TimerTask解决方案封送到UI线程时遇到了一些问题,因此这里有另一个解决方案最终对我有效

处理程序的创建通常在onCreate()中。mHandler变量本身将在类中定义为成员。sendEmptyMessageDelayed()方法将进入onCreate()或单击按钮以启动刷新序列。我不确定行刷新的最佳操作。我没有在安卓系统中处理过这个问题。然而,我给了你一个很好的方法来自动刷新。但是看看代码,我不确定为什么它需要刷新。onDraw()被重写,这对我来说意味着无论何时绘制(每帧?)它都应该执行其中的代码。如果它不是自动执行的,那么也许您可以找到一种方法,从处理程序内部访问onDraw()方法,以便以这种方式刷新它。@Knossos这将只更新一次(在mmillieSecondStoreFresh之后),然后停止。它实际上不会继续运行。处理程序的创建通常在onCreate()中。mHandler变量本身将在类中定义为成员。sendEmptyMessageDelayed()方法将进入onCreate()或单击按钮以启动刷新序列。我不确定行刷新的最佳操作。我没有在安卓系统中处理过这个问题。然而,我给了你一个很好的方法来自动刷新。但是看看代码,我不确定为什么它需要刷新。onDraw()被重写,这对我来说意味着无论何时绘制(每帧?)它都应该执行其中的代码。如果它不是自动执行的,那么也许您可以找到一种方法,从处理程序内部访问onDraw()方法,以便以这种方式刷新它。@Knossos这将只更新一次(在mmillieSecondStoreFresh之后),然后停止。事实上,它不会继续运行。请记住,我们现在使用的是Android,所以Swing不可用。此外,您还必须使用处理程序,因为您只能在UI线程内执行UI更改。你绝对不应该让UI线程处于休眠状态。请记住,我们现在使用的是Android,所以Swing不可用。此外,您还必须使用处理程序,因为您只能在UI线程内执行UI更改。而且你绝对不应该让UI线程处于休眠状态。+1为我这个使用生锈Java的Android新手提供了窍门+作为一个使用生锈Java的Android新手,1为我做了这件事!