您的位置:首页 > 移动开发 > Android开发

发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案

2017-12-28 17:03 375 查看


发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案

博客分类: 

Android

在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示。但是,在主线线程之外的线程中直接更新页面显示的问题是

报异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.



在工作线程中处理UI线程报错【只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)】

也就是说必须在一般必须在程序的主线程(也就是ui)线程中进行更新界面显示的工作。可以采用下面的方法之一来解决:

 

法1:

在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。

 

Java代码  


  /** 

     * 启动线程用来刷新登录提示文字,N秒刷新一次 

     *  

     */  

    private class FreshWordsThread extends Thread  

    {  

        @Override  

        public void run()  

        {  

            try  

            {  

                mLoadingWords = "test";  

                mLoadhandler.sendEmptyMessage(REFRESH);  

            }  

            catch (InterruptedException e)  

            {  

                e.printStackTrace();  

                Thread.currentThread().interrupt();  

            }  

        }  

    }  

  

  

  

    //主线程中的handler  

    class LoadHandler extends Handler  

    {  

        /** 

         * 接受子线程传递的消息机制 

         */  

        @Override  

        public void handleMessage(Message msg)  

        {  

            super.handleMessage(msg);  

            int what = msg.what;  

  

            Log.i(TAG, "Main handler message code: " + what);  

            switch (what)  

            {                  

                case REFRESH:  

                {  

                    // 刷新页面的文字  

                    mLoadingText.setText(mLoadingWords);  

                    break;  

                }  

  

            }  

        }  

        

    }  

 

 

法2:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。

 

Java代码  


FusionField.currentActivity.runOnUiThread(new Runnable()  

        {  

            public void run()  

            {  

                Toast.makeText(FusionField.currentActivity, "Success",  

                        Toast.LENGTH_LONG).show();  

            }  

  

        }); 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐