在Android中线程UI更新
我刚刚开始使用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(); } } }
它工作正常,但每个人都说在主线程中做图形,所以我试图(和失败)将它传递给另一个线程。 麻烦的是,我完全不知道,因为我从来没有使用过线程。
Google给出的有关使用线程的示例似乎并不十分清晰,我也无法真正按照自己的想法遵循它。 我可以问一个人在这里给我一个最基本的例子,说明我如何能够有效地使用线程来做我在这里做的事情?
提前致谢 :)
好吧,我猜这里有一些混乱。 您必须从主线程(也称为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();
}
}
使用onDraw()
中的invalidate()
旧代码,即使在没有更改的情况下,您仍然会重新绘制gui。
新代码的重要部分是postInvalidate()
。 这可以告诉GUI线程 - 从另一个线程 - 重新绘制GUI。
您可以使用AsyncTask进行线程化,基本知识如下:无痛线程,例如:Multithreading For Performance。
要更新UI使用更新处理程序,请看看这个。 每次你想更新UI时,你都会从线程发送一条消息到你的主UI线程。
那么第一个问题是 - 为什么你想在一个单独的线程中做你的图形? 因为除非你正在做某些特定的事情(主要是在游戏或媒体领域),否则如果你尝试这样做,你会发现自己处于很多痛苦中,没有什么益处。
链接地址: http://www.djcxy.com/p/31447.html