我该如何解决? 这是我的按钮点击方法,我从内部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
答案 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() { ... }