Ну, я думаю, здесь происходит некоторая путаница.Вы ДОЛЖНЫ выполнять обновления GUI из основного потока (также называемого потоком GUI) - в противном случае вы получите что-то вроде «Исключение, blabla утекла представление».
Я думаю, что неправильно поняли, что дорогие операцииНапример, работа в сети должна выполняться в другом потоке, нежели основной поток.И если вы хотите обновить графический интерфейс пользователя из сетевого потока, то вы будете делать то, что говорит 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()
, вы будете непрерывно перерисовывать графический интерфейс, даже если в нем нет изменений.
Важныйчасть нового кода postInvalidate()
.Это позволяет указать потоку GUI - из другого потока - перерисовать GUI.