有人可以修复我的CalledFromWrongThreadException吗?

时间:2011-07-18 20:07:19

标签: java android

我有一个活动开始然后创建一个新的NetworkHandler实例,在NetworkHandler中我在一个新线程上运行它,这样UI线程就不会卡住。 NetworkHandler有一个run()方法,坐在while((message = reader.readLine())!= null)。 reader是一个BufferedReader,消息是一个String。然后UI线程继续进行布局。当用户导航到登录屏幕并单击登录按钮时,客户端向服务器发送消息并接收信息,即用户名/密码组合是否正确。然后执行流读取的线程(while循环)继续并尝试更改布局,以便在登录成功时弹出游戏屏幕或者屏幕上显示某些内容。它给了我这个烦人的例外,并没有改变布局。我之前在android中遇到过这个问题,我不明白你为什么要从UI线程中调用View更改。这对我来说没有意义。在Java中我知道你可以做到这一点,我已经为我的计算机制作了大约一百个应用程序,我知道java没有这个问题。谁能解释一下?所有相关的答案都表示赞赏!

3 个答案:

答案 0 :(得分:1)

AsyncTask可用于通过其onProgressUpdateonPostExecute方法从不同线程上的任务方便地在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工具包的运行组件交互的线程。