为什么我得到异常ViewRootImpl $ CalledFromWrongThreadException?

时间:2015-08-06 23:07:21

标签: java android android-studio

我该如何解决? 这是我的按钮点击方法,我从内部onCreate调用它:

public void addListenerOnButton()
{
    btnClick = (Button) findViewById(R.id.checkipbutton);
    btnClick.setOnClickListener(new OnClickListener()
    {
        byte[] response = null;
        @Override
        public void onClick(View arg0)
        {
            text = (TextView) findViewById(R.id.textView2);
            Thread t = new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    for (int i = 0; i < ipaddresses.length; i++)
                    {
                        try
                        {
                             response = Get(ipaddresses[i]);
                             if (response == null)
                             {
                                  text.setText("Connection Failed: " + generateRunnablePrinter(i));
                             }
                         }
                         catch (Exception e)
                         {
                              String err = e.toString();
                         }
                         if (response != null)
                         {
                             try
                             {
                                 final String a = new String(response, "UTF-8");
                                 text.post(new Runnable()
                                 {
                                     @Override
                                     public void run()
                                     {
                                         text.setText(a);
                                     }
                                 });
                                 iptouse = ipaddresses[i].substring(0, 26);
                                 connectedtoipsuccess = true;
                                 Logger.getLogger("MainActivity(inside thread)").info(a);
                             }
                             catch (UnsupportedEncodingException e)
                             {
                                 e.printStackTrace();
                                 Logger.getLogger("MainActivity(inside thread)").info("encoding exception");
                             }
                             Logger.getLogger("MainActivity(inside thread)").info("test1");
                             break;
                         }
                         else
                         {
                         }
                     }
                }
           });
           t.start();
        }
    });
}

在FOR循环内的方法中的这个位置,变量'i'应该是final:

text.setText("Connection Failed: " + generateRunnablePrinter(i));

但是因为'i'也是FOR循环的变量,所以我不能让它成为最终的。 所以我添加了方法:generateRunnablePrinter

private Runnable generateRunnablePrinter(final int value)
{
    return new Runnable() {
        public void run()
        {
            text.setText("Connection Failed: " + ipaddresses[value]);
        }
    };
}

但是现在使用这种方法我得到了例外:

ViewRootImpl $ CalledFromWrongThreadException

2 个答案:

答案 0 :(得分:0)

您无法更改TextView&#34;的文本UI&#34;从另一个线程中,您可以尝试使用AsyncTask在doInBackground()方法中在后台完成工作,然后在方法onPostExecute()中更改UI。 看看AsyncTask: http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:0)

由于您正在调整UI,因此您需要从UI线程运行它。我推荐这个功能:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
    // Your code here...
    }
});

如果您从除活动之外的任何其他地方调用它,您需要传递活动或使用getActivity()(即从片段)获取活动,然后调用该函数来自活动,即getActivity().runOnUiThread() { ... }