内螺纹无法创建处理程序已经不叫尺蠖。prepare() [英] Can't create handler inside thread which has not called Looper.prepare()

查看:130
本文介绍了内螺纹无法创建处理程序已经不叫尺蠖。prepare()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个活动,并在这我有一个类。

 文本=新Dynamictext(...);
text.setText(名为txt);
 

在我DynamicText的java我有这个code:

 公共无效的setText(字符串文本){
    this.text =文本;
    新asyncCreateText()执行()。
    //this.createText(text);
}

//专用处理器处理器=新的处理程序();

私有类asyncCreateText扩展的AsyncTask<虚空,虚空,虚空>
{
    @覆盖
    保护无效doInBackground(空...未使用){
        返回null;
    }

    @覆盖
    保护无效onPostExecute(作废不用){

    }
}
 

我得到:

  

ERROR / AndroidRuntime(5176):java.lang.RuntimeException的:所致。内螺纹已经不叫尺蠖prepare无法创建处理程序()

我该如何处理这个问题?

ERROR / AndroidRuntime(5370):java.lang.ExceptionInInitializerError ERROR / AndroidRuntime(5370):在com.l.start.DynamicText.setText(DynamicText.java:125) ERROR / AndroidRuntime(5370):在com.l.start.OpenGLRenderer.initfonts(OpenGLRenderer.java:168) ERROR / AndroidRuntime(5370):在com.l.start.OpenGLRenderer.init(OpenGLRenderer.java:119) ERROR / AndroidRuntime(5370):在com.l.start.OpenGLRenderer.onSurfaceChanged(OpenGLRenderer.java:90) ERROR / AndroidRuntime(5370):在android.opengl.GLSurfaceView $ GLThread.guardedRun(GLSurfaceView.java:1120) ERROR / AndroidRuntime(5370):在android.opengl.GLSurfaceView $ GLThread.run(GLSurfaceView.java:975) ERROR / AndroidRuntime(5370):java.lang.RuntimeException的:产生的原因:     内螺纹无法创建处理程序,并没有所谓的活套。prepare() ERROR / AndroidRuntime(5370):在android.os.Handler< INIT>(Handler.java:121)。 。ERROR / AndroidRuntime(5370):在android.os.AsyncTask $ InternalHandler< INIT>(AsyncTask.java:421) 。ERROR / AndroidRuntime(5370):在android.os.AsyncTask $ InternalHandler< INIT>(AsyncTask.java:421) ERROR / AndroidRuntime(5370):在android.os.AsyncTask< clinit>(AsyncTask.java:152)。 ERROR / AndroidRuntime(5370):... 6个

解决方案

该错误是不言自明... doInBackground()运行在后台线程其中,由于它并非意在循环中,不连接到一个活套

您很可能不希望直接实例化处理程序在所有...无论数据的 doInBackground()实施收益将被传递给 onPostExecute()它运行在UI线程上。

后加入堆栈跟踪中出现的问题:

看起来你试图启动的AsyncTask 从GL渲染线程...不这样做COS,他们永远不会 Looper.loop()无论是。 AsyncTasks真正设计成只从UI线程中运行。

破坏性最小的修复很可能会调用 Activity.runOnUiThread()的Runnable 揭开序幕您的AsyncTask

I have an Activity, and in that I have a class.

text=new Dynamictext(...);
text.setText("txt");

in my DynamicText java I have this code:

public void setText(String text) {
    this.text=text;
    new asyncCreateText().execute();
    //this.createText(text);
}

//private Handler handler = new Handler();

private class asyncCreateText extends AsyncTask<Void, Void, Void> 
{
    @Override
    protected Void doInBackground(Void... unused) {
        return null;
    }

    @Override
    protected void onPostExecute(Void unused) {

    }
}

I get:

ERROR/AndroidRuntime(5176): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

How can I handle this error?

ERROR/AndroidRuntime(5370): java.lang.ExceptionInInitializerError
ERROR/AndroidRuntime(5370):     at com.l.start.DynamicText.setText(DynamicText.java:125)
ERROR/AndroidRuntime(5370):     at com.l.start.OpenGLRenderer.initfonts(OpenGLRenderer.java:168)
ERROR/AndroidRuntime(5370):     at com.l.start.OpenGLRenderer.init(OpenGLRenderer.java:119)
ERROR/AndroidRuntime(5370):     at com.l.start.OpenGLRenderer.onSurfaceChanged(OpenGLRenderer.java:90)
ERROR/AndroidRuntime(5370):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1120)
ERROR/AndroidRuntime(5370):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:975)

ERROR/AndroidRuntime(5370): Caused by: java.lang.RuntimeException: 
    Can't create handler inside thread that has not called Looper.prepare()
ERROR/AndroidRuntime(5370):     at android.os.Handler.<init>(Handler.java:121)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
ERROR/AndroidRuntime(5370):     ... 6 more

解决方案

The error is self-explanatory... doInBackground() runs on a background thread which, since it is not intended to loop, is not connected to a Looper.

You most likely don't want to directly instantiate a Handler at all... whatever data your doInBackground() implementation returns will be passed to onPostExecute() which runs on the UI thread.

ADDED FOLLOWING THE STACKTRACE APPEARING IN QUESTION:

Looks like you're trying to start an AsyncTask from a GL rendering thread... don't do that cos they won't ever Looper.loop() either. AsyncTasks are really designed to be run from the UI thread only.

The least disruptive fix would probably be to call Activity.runOnUiThread() with a Runnable that kicks off your AsyncTask.

这篇关于内螺纹无法创建处理程序已经不叫尺蠖。prepare()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆