在Android中线程化UI更新

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有效地做我在这里做的事情?

提前致谢 :)

Cpt*_*und 7

好吧,我猜这里有一些混乱.你必须从主线程(也称为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.