当前位置: 首页 > 面试题库 >

Android中的线程UI更新

凌联
2023-03-14
问题内容

我刚刚开始进行android开发,并且更新UI确实使我很烦:/

到目前为止,这是我一直在努力的工作-

打包项目。

导入android.os.Bundle;
导入android.view.View;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.Canvas;
导入android.graphics.Paint;
导入android.graphics.Color;

公共类Move扩展Activity {

    私有浮点y = 0;
    私人很久现在= 0;  
    私人浮动延迟= 75;
    私人Paint paint = new Paint();

    @Override
    受保护的void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(new SimpleMotion(this));
        paint.setColor(Color.BLACK);
    }
    私有类SimpleMotion扩展了View {

        公共SimpleMotion(上下文上下文){
            超级(上下文);
        }

        @Override protected void onDraw(Canvas canvas){

            浮点数x = canvas.getWidth()/ 2;
            canvas.drawColor(Color.WHITE);
            canvas.drawCircle(x,y,30,paint);  
            if(System.currentTimeMillis()-现在>延迟)y ++;    
            invalidate();
        }
    }
}

它工作正常,但是每个人都说要在主线程中做图形,所以我正在尝试(但失败)将其传递给另一个线程。麻烦的是,我真的不知道怎么做,因为我从未真正使用过线程。

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();
        }
    }

使用旧的代码,即使没有更改invalidate()onDraw()您也将不断重绘该gui。

新代码的重要部分是postInvalidate()。这样就可以告诉GUI线程-从另一个线程-重绘该GUI。



 类似资料:
  • 问题内容: 我想更改Android中的UI。 我的主类创建第二个类,然后第二个类调用主类的方法。主类中的方法应更新UI,但程序在运行时会崩溃。 我该怎么办? 我的主要班级: 还有我的第二堂课: 问题答案: 您不能从主线程以外的线程调用UI方法。您应该使用Activity#runOnUiThread()方法。

  • 我正在编写一个Android应用程序,它连接到蓝牙设备,读取设备发送的数据,将其添加到AChartEngine图形中,并在文本视图中显示数据。 我的Bluetooth代码与BluetoothChat示例代码中的线程实现非常相似(它与SDK一起提供)。我可以在LogCat中看到< code>ConnectedThread循环正在执行并因此获得新数据,但我的TextView在7行之后停止更新,图形间歇

  • 本文向大家介绍详解Android中OkHttp3的例子和在子线程更新UI线程的方法,包括了详解Android中OkHttp3的例子和在子线程更新UI线程的方法的使用技巧和注意事项,需要的朋友参考一下 okHttp用于android的http请求。据说很厉害,我们来一起尝尝鲜。但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来。 首先需要了解一点,这里说的UI线程和主线程是一回事儿。

  • 问题内容: 我对android完全陌生,只想知道它是否是在主线程外更新UI的任何可行且可行的方法。仅从我的代码中,我就在下面列出了这些代码;根本不可能。但是, 我只想使用另一个线程来更新UI 。请事先帮助我! 问题答案: 使用activity.runOnUiThread

  • 本文向大家介绍Android子线程与更新UI问题的深入讲解,包括了Android子线程与更新UI问题的深入讲解的使用技巧和注意事项,需要的朋友参考一下 前言 在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法。话不多说了,来一起看看详细的介绍吧 引子: 情形1 运行结果:正常运行!!! 情形二 运行结果:异常     and

  • 本文向大家介绍解决PySide+Python子线程更新UI线程的问题,包括了解决PySide+Python子线程更新UI线程的问题的使用技巧和注意事项,需要的朋友参考一下 在我开发的系统,需要子线程去运行,然后把运行的结果发给UI线程,让UI线程知道运行的进度。 首先创建线程很简单 之后我发现用子线程去调用UI线程是行不通的,只能通过信号和槽来实现,于是 首先,定义一个类,让他实现PySide.Q