我有一个活动开始然后创建一个新的NetworkHandler实例,在NetworkHandler中我在一个新线程上运行它,这样UI线程就不会卡住。 NetworkHandler有一个run()方法,坐在while((message = reader.readLine())!= null)。 reader是一个BufferedReader,消息是一个String。然后UI线程继续进行布局。当用户导航到登录屏幕并单击登录按钮时,客户端向服务器发送消息并接收信息,即用户名/密码组合是否正确。然后执行流读取的线程(while循环)继续并尝试更改布局,以便在登录成功时弹出游戏屏幕或者屏幕上显示某些内容。它给了我这个烦人的例外,并没有改变布局。我之前在android中遇到过这个问题,我不明白你为什么要从UI线程中调用View更改。这对我来说没有意义。在Java中我知道你可以做到这一点,我已经为我的计算机制作了大约一百个应用程序,我知道java没有这个问题。谁能解释一下?所有相关的答案都表示赞赏!
答案 0 :(得分:1)
AsyncTask
可用于通过其onProgressUpdate
和onPostExecute
方法从不同线程上的任务方便地在UI线程上运行某些任务。
答案 1 :(得分:1)
当您要更新布局时,使用Handler.post(...)
切换到UI线程。像这样:
private Handler myHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myHandler = new Handler();
}
public void loadInBackround() {
while(...) {
// do stuff
}
final result = ....;
myHandler.post(new Runnable() {
@Override
public void run() {
// update the layout with data from 'result'
...
}
});
}
请注意,结果具有final
修饰符 - 从Runnable内部访问它是必需的。还要注意,处理程序本身必须在UI线程上创建,例如在onCreate
。
答案 2 :(得分:0)
http://developer.android.com/resources/articles/painless-threading.html
启动应用程序时,系统会为应用程序创建一个名为“main”的线程。主线程(也称为UI线程)非常重要,因为它负责将事件分派给适当的小部件,包括绘图事件。它也是您的应用程序与Android UI工具包的运行组件交互的线程。