编程-Android线程与ui绘制的问题

问题描述

Android线程与ui绘制的问题

当然知道只能在主线程更新UI,不过我有个非常费时的UI绘制操作(就是一堆自定义的view退出时保存在文件里,然后进入时读取文件绘制ui恢复界面,实测短板出现在view的绘制过程)

然后我一开始觉得只要View不添加就只是对象而已,然后尝试新开一个线程把这些控件new出来,然后在主线程addView,结果在我的平板(5.1.1)上完美运行,在手机(4.2.2)上闪退。

继续测试手机,新开一个线程,一个执行一句new一个edittext就崩溃,不过更加奇怪的是换成textview就正常。完全不明就里。

ps,大家有什么替代方法,也望不吝赐教,感激不尽

按照大家的提醒贴代码(实际的代码太长不便理解,我就写了一个TextView和EditText的,意思一样,而且方便大家理解。)

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                new TextView(mActivity);
            } catch (Exception e) {
                Log.d("debug", Log.getStackTraceString(e));
                return;
            }
            Log.d("debug", "成功地new了一个TextView");
            try {
                new EditText(mActivity);
            } catch (Exception e) {
                Log.d("debug", Log.getStackTraceString(e));
                return;
            }
            Log.d("debug", "成功地new了一个EditText");
        }
    }).start();
}

附上Logcat输出:

02-23 03:29:13.144 16364-16440/com.example.multicalc D/debug: 成功地new了一个TextView
02-23 03:29:13.156 16364-16440/com.example.multicalc D/debug: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.(Handler.java:197)
at android.os.Handler.(Handler.java:111)
at android.widget.Editor$UserDictionaryListener.(Editor.java:3836)
at android.widget.Editor.(Editor.java:192)
at android.widget.TextView.createEditorIfNeeded(TextView.java:8475)
at android.widget.TextView.(TextView.java:1114)
at android.widget.EditText.(EditText.java:60)
at android.widget.EditText.(EditText.java:56)
at android.widget.EditText.(EditText.java:52)
at com.example.multicalc.matrix.ui.WorkWindow$1.run(WorkWindow.java:174)
at java.lang.Thread.run(Thread.java:856)

解决方案

弱引用的方式,防止内存泄漏

解决方案二:

先开一个内存Image对象,线程中对它绘图,然后再一次性加载到界面上。

解决方案三:

runOnUiThread(new Runnable(){
@Override
public void run() {
//更新UI,new控件
}
}

解决方案四:

直接在线程中addView就好,不然可能出现NullPointerException.

解决方案五:

挂了是报出了什么错误,粘一下错误日志看下...

解决方案六:

根据日志看什么错误, 不然就只有乱猜

解决方案七:

这个在onResume里重写一遍就好了吧

解决方案八:

弄个内存缓存池,把创建的view缓存下来

解决方案九:

线程里new一个view我还是第一次见,new出来的对象又没使用过,这里局部new的view,主线程也拿不到这个变量。你是否要addview呢,一addview必定报错。线程中绘制界面请了解下surfaceview的双缓冲机制。或者简单实现用线程读取数据,完成之后handler通知view更新。
我不知道线程里new view行不行,但是我没听说过

解决方案十:

代码报错看来,显然edittext在创建的时候会自动创建handler,这个handler他需要做什么事,也许是用来通知绘制光标的改变等等。这个handler创建的时候在工作线程了,所以报错了。
可以去看下new edittext里面的机制。
我猜,textview在创建的时候不会去new handler所以暂时没报错

时间: 2024-09-09 11:05:00

编程-Android线程与ui绘制的问题的相关文章

android中子线程更新UI的方式

一.为何写作此文 你是不是经常看到很多书籍中说:不能在子线程中操作ui,不然会报错.你是不是也遇到了如下的疑惑(见下面的代码): (Bundle savedInstanceState) { .onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); Thread.currentThread().setName(); LooperThrea

Android开发之子线程操作UI的几种方法_Android

 在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如

Android中子线程和UI线程通信详解_Android

Android中子线程和UI线程之间通信的详细解释 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢?下面详解一下. 2.首先在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. 3.Handler: (1).概念: Handler是沟通Activity 与Thread/runnable的桥梁.而Handler是运行在主UI线程中的,它与子线程

Android中子线程和UI线程通信详解

Android中子线程和UI线程之间通信的详细解释 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢?下面详解一下. 2.首先在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. 3.Handler: (1).概念: Handler是沟通Activity 与Thread/runnable的桥梁.而Handler是运行在主UI线程中的,它与子线程

ui-关于android子线程操作UI的问题

问题描述 关于android子线程操作UI的问题 看到的所有的资料上都说android的子线程不能操作UI,抱着好奇心我写了下面的程序,竟然运行成功了,不知谁能解释一下这个问题 public class MainActivity extends Activity { Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon

线程-Android中用canvas如何绘制动态图?请大神速回,在线等!!

问题描述 Android中用canvas如何绘制动态图?请大神速回,在线等!! public class MyView extends View { private Paint paint; private int roundColor, roundProgressColor; private float roundWidth; private int style; private int process = 1; private Canvas mcanvas; private RectF ov

详解Android中OkHttp3的例子和在子线程更新UI线程的方法

okHttp用于android的http请求.据说很厉害,我们来一起尝尝鲜.但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来. 首先需要了解一点,这里说的UI线程和主线程是一回事儿.就是唯一可以更新UI的线程.这个只是点会在给okHttp填坑的时候用到.而且,这个内容本身在日常的开发中也经常用到,值得好好学一学. okHttp发起同步请求 第一个列子是一个同步请求的例子. private void performSyncHttpRequest() { OkHttpClient

Android开发之子线程操作UI的几种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如果

Android编程实现扭曲图像的绘制功能示例

本文实例讲述了Android编程实现扭曲图像的绘制功能.分享给大家供大家参考,具体如下: 为了实现动画效果,使用drawBitmapMess方法对图像进行扭曲,使用定时器以100毫秒的频率按圆形轨迹扭曲图像. 扭曲的关键是生成verts数组.本例一开始会先生成verts数组的初始值:有一定水平和垂直间距的网点坐标.然后通过warp方法按一定的数学方法变化verts数组中的坐标.关键部分的代码如下: 定义基本变量:MyView是用于显示扭曲的图像的自定义view,angle是圆形轨迹的当前角度: