Android动画的简单线程问题

我正在尝试使用一些简单的Android动画实现一个线程。 我只是在sleep()中遇到错误 – 它说我需要一个方法。 我知道可能有一个明显的解决方案。 我的应用程序只是放置一个随机位置移动的球。 我想要的是继续在随机位置放置形状。 无论如何,有人可以告诉我我的线程做错了吗? 谢谢。

public class DrawingTheBall extends View { Bitmap bball; Random randX, randY; double theta; Handler m_handler; Runnable m_handlerTask; //for some reason I get a syntax error here m_handler = new Handler(); public DrawingTheBall(Context context) { super(context); // TODO Auto-generated constructor stub bball = BitmapFactory.decodeResource(getResources(), R.drawable.blueball); //randX = 1 + (int)(Math.random()*500); //randY = 1 + (int)(Math.random()*500); randX = new Random(); randY = new Random(); theta = 45; new Thread(this).start(); } public void onDraw(Canvas canvas){ super.onDraw(canvas); //Radius, angle, and coordinates for circle motion float a = 50; float b = 50; float r = 50; int x = 0; int y = 0; theta = theta + Math.toRadians(2); //move ball in circle if(x < canvas.getWidth()){ x = randX.nextInt() + (int) (a +r*Math.cos(theta)); }else{ x = 0; } if(y < canvas.getHeight()){ y = randY.nextInt() + (int) (b +r*Math.sin(theta)); }else{ y = 0; } Paint p = new Paint(); } m_handlerTask = new Runnable() { @Override public void run() { // do something m_handler.postDelayed(m_handlerTask, 1000); invalidate(); } }; m_handlerTask.run(); 

}}

如果您实现Thread或HandlerThread,请确保您的UI线程在等待工作线程完成时不会阻塞 – 不要调用Thread.wait()Thread.sleep()

http://developer.android.com/training/articles/perf-anr.html

在等待工作线程完成时,您的主线程应该为其他线程提供一个Handler ,以便在完成时回发。

使用处理程序

  Handler m_handler; Runnable m_handlerTask ; m_handler = new Handler(); m_handlerTask = new Runnable() { @Override public void run() { // do something m_handler.postDelayed(m_handlerTask, 1000); // instad of 1000 mention the delay in milliseconds } }; m_handlerTask.run(); 

当你需要取消处理程序时,使用m_handler.removeCallbacks(m_handlerTask);

例:

  public class MainActivity extends Activity { RelativeLayout rl; int x = 0,y=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rl = (RelativeLayout) findViewById(R.id.rl); CustomView cv = new CustomView(this); rl.addView(cv); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public class CustomView extends View { Bitmap bball; Random randX, randY; double theta; Handler m_handler; Paint p ; int width; int height; Runnable m_handlerTask; public CustomView(Context context) { super(context); // TODO Auto-generated constructor stub p= new Paint(); bball = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); //randX = 1 + (int)(Math.random()*500); //randY = 1 + (int)(Math.random()*500); randX = new Random(); randY = new Random(); theta = 45; m_handler = new Handler(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // TODO Auto-generated method stub super.onSizeChanged(w, h, oldw, oldh); width =w; height=h; } public void move() { m_handlerTask = new Runnable() { @Override public void run() { //theta = theta + Math.toRadians(2); if(x<300) { x= x+10; invalidate(); } else if(x>300) { x=0; m_handler.removeCallbacks(m_handlerTask); } // canvas.drawBitmap(bball, x, y, p); m_handler.postDelayed(m_handlerTask, 3000); } }; m_handlerTask.run(); } public void onDraw(final Canvas canvas){ super.onDraw(canvas); canvas.drawBitmap(bball, x, y, p); if(x<300) { move(); } else { m_handler.removeCallbacks(m_handlerTask); } } } }