Mar*_*k D 6 java user-interface multithreading android
我刚刚开始使用android开发和更新UI真的很烦我:/
这就是我到目前为止所做的工作 -
package projects.Move;
import android.os.Bundle;
import android.view.View;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Color;
public class Move extends Activity {
private float y = 0;
private long now = 0;
private float delay = 75;
private Paint paint = new Paint();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SimpleMotion(this));
paint.setColor(Color.BLACK);
}
private class SimpleMotion extends View {
public SimpleMotion(Context context) {
super(context);
}
@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();
}
}
}
它工作正常但每个人都说在主线程中做你的图形,所以我正在尝试(并且失败)将它传递给另一个线程.麻烦的是,我完全不知道为什么我从未使用Threads.
Google使用Threads提供的示例似乎并不十分清楚,我无法按照我想要的方式执行此操作.请问有人在这里给我一个最基本的例子,说明如何使用Threads有效地做我在这里做的事情?
提前致谢 :)
好吧,我猜这里有一些混乱.你必须从主线程(也称为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();
}
}
Run Code Online (Sandbox Code Playgroud)
有了您具有旧代码invalidate()中onDraw(),你会汽车无被重绘GUI即使有政策没有变化.
新代码的重要部分是postInvalidate().这使得可以告诉GUI线程 - 从另一个线程 - 重绘GUI.