java – 在Android中线程化UI更新

前端之家收集整理的这篇文章主要介绍了java – 在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();
        }
    }
}

它工作正常但每个人都说在主线程中做你的图形,所以我正在尝试(并且失败)将它传递给另一个线程.麻烦的是,我完全不知道为什么我从未使用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,paint);  
//            if(System.currentTimeMillis() - now > delay) y++;    
//            invalidate();
        }
    }

使用onDraw()中的invalidate()旧代码,即使没有更改,也会不断重绘gui.

代码的重要部分是postInvalidate().这使得可以告诉GUI线程 – 从另一个线程 – 重绘GUI.

猜你在找的Android相关文章