gpt4 book ai didi

java - Android 中的线程 UI 更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:33:43 26 4
gpt4 key购买 nike

我刚开始进行 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 给出的关于使用 Threads 的示例似乎不是很清楚,我无法真正按照它去做我想做的事情。我可以请这里的人给我一个最基本的例子,说明我如何使用线程高效地完成我在这里所做的事情吗?

提前致谢:)

最佳答案

嗯,我猜这里有些困惑。您必须从主线程(也称为 GUI 线程)执行 GUI 更新 - 否则您会得到类似“异常,blabla 泄露了 View ”的信息。

我想人们误解了昂贵的操作,例如网络,应该在与主线程不同的线程中完成。如果您想从网络线程更新 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 成为可能。

关于java - Android 中的线程 UI 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3745405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com