好吧,我想这里有些混乱。您必须从主线程(也称为GUI线程)进行GUI更新-否则您将得到类似“异常,blabla泄漏了视图”之类的信息。
我猜误解的是,昂贵的操作(例如联网)应该在与主线程不同的线程中完成。而且,如果您想从网络线程更新GUI,请按照ArtWorkAD所说(或他的链接说)进行。
因此,对于您想做的事情,可以通过将SimpleMotion类替换为以下内容来实现:
private class SimpleMotion extends View { public SimpleMotion(Context context) { super(context); new Thread(new Runnable() { public void run() { while(true){ try { Thread.sleep(75); y++; postInvalidate(); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } @Override protected void onDraw(Canvas canvas) { float x = canvas.getWidth() / 2; canvas.drawColor(Color.WHITE); canvas.drawCircle(x, y, 30, paint); // if(System.currentTimeMillis() - now > delay) y++; // invalidate(); } }使用旧的代码,即使没有更改
invalidate(),
onDraw()您也将不断重绘该gui。
新代码的重要部分是
postInvalidate()。这样就可以告诉GUI线程-从另一个线程-重绘该GUI。



