首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法在尚未调用Looper.prepare()的线程内创建处理程序

无法在尚未调用Looper.prepare()的线程内创建处理程序
EN

Stack Overflow用户
提问于 2011-02-16 05:36:21
回答 7查看 231.3K关注 0票数 81

我有一个活动,其中我有一节课。

代码语言:javascript
复制
text=new Dynamictext(...);
text.setText("txt");

在我的DynamicText java中,我有这样的代码:

代码语言:javascript
复制
public void setText(String text) {
    this.text=text;
    new asyncCreateText().execute();
    //this.createText(text);
}

//private Handler handler = new Handler();

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

    @Override
    protected void onPostExecute(Void unused) {

    }
}

我得到了:

错误/AndroidRuntime(5176):由: java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序

如何处理此错误?

代码语言:javascript
复制
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.(Handler.java:121)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask$InternalHandler.(AsyncTask.java:421)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask$InternalHandler.(AsyncTask.java:421)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask.(AsyncTask.java:152)
ERROR/AndroidRuntime(5370):     ... 6 more
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-02-16 05:43:29

这个错误是不言而喻的.

在后台线程上运行,由于后台线程不打算循环,因此不会连接到

..。

您很可能根本不想直接实例化一个Handler ...无论您

实现返回将传递到

它在UI线程上运行。

代码语言:javascript
复制
mActivity = ThisActivity.this; 

    mActivity.runOnUiThread(new Runnable() {
     public void run() {
     new asyncCreateText().execute();
     }
   });

在出现问题的空格后添加:

看起来你想要开始

从GL渲染线程...不要那样做,因为他们永远不会

都不是。AsyncTasks实际上被设计为只能从UI线程运行。

破坏性最小的修复方法可能是调用

使用

开始你的

..。

票数 147
EN

Stack Overflow用户

发布于 2012-04-06 00:00:19

上面所有的答案都是正确的,但我认为这是最简单的例子:

代码语言:javascript
复制
public class ExampleActivity extends Activity {
    private Handler handler;
    private ProgressBar progress;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        progress = (ProgressBar) findViewById(R.id.progressBar1);
        handler = new Handler();
    }

    public void clickAButton(View view) {
        // Do something that takes a while
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                handler.post(new Runnable() { // This thread runs in the UI
                    @Override
                    public void run() {
                        progress.setProgress("anything"); // Update the UI
                    }
                });
            }
        };
        new Thread(runnable).start();
    }
}

这样做是从一个完全不同的线程更新UI线程中的进度条,该线程通过活动中声明的处理程序的post()方法传递。

希望能有所帮助!

票数 32
EN

Stack Overflow用户

发布于 2014-12-22 17:36:22

你可以通过这种方式在后台线程中创建处理程序

代码语言:javascript
复制
private void createHandler() {
        Thread thread = new Thread() {
          public void run() {
               Looper.prepare();

               final Handler handler = new Handler();
               handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                       // Do Work
                        handler.removeCallbacks(this);
                        Looper.myLooper().quit();
                   }
                }, 2000);

                Looper.loop();
            }
        };
        thread.start();
    }
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5009816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档