0

我正在尝试在启动 HttpClient 的函数上实现一个线程,因为它是根据 d.android.com 推荐的所以我已经实现了一个线程但是,它似乎没有运行,就像我删除了我看到结果的线程代码一样.

这是我的代码:

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat_box);// sd
    TextView inbox = (TextView) findViewById(R.id.inbox);
    final Functions function = new Functions();
    final SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    where = prefs.getString("chat", "null");

    class SendThread extends Thread {
           public void run(){
                //getInbox() runs an http client
               listOfMessages = function.getInbox(where);

           }
        }
    SendThread sendThread  = new SendThread();
    sendThread.start();

    inbox.setText(listOfMessages);

}

就像我上面说的,如果我删除我的线程代码,那么它会完美运行。关于我做错了什么的任何想法?这是我第一次使用线程,对于任何菜鸟的错误,请见谅。

我没有收到任何错误(至少我没有看到任何错误)但是,我没有看到没有插入线程代码的输出。

4

2 回答 2

2

我同意其他人的观点:1)您没有让线程完成,2)您必须在主线程上修改 UI。我想你可能想看到一个具体的解决方案,所以你去:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat_box);// sd

    final Functions function = new Functions();
    final SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    where = prefs.getString("chat", "null");
    new AsyncTask<String, Void, String>() {
        @Override
        protected String doInBackground(String... args) {
            return function.getInbox(args[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            TextView inbox = (TextView) findViewById(R.id.inbox);
            inbox.setText(result);
        }

    }.execute(where);
}

AsyncTask 的使用使这变得超级简单:它是 Android 推荐的在主线程之外执行简单任务的方法。当调用execute() 时,会创建一个新线程并调用doInBackground()。然后将结果在主线程上返回给 onPostExecute 方法。因此,您不必处理 runOnUiThread 或其他任何事情。

在这种情况下需要注意的一件事是:在诸如方向更改之类的情况下,您的 Activity 将被销毁并重新创建,因此将再次调用 getInbox() 。这可能是也可能不是问题,具体取决于该方法实际需要多长时间。如果不可接受,则需要静态 AsyncTask 之类的东西,但随后会遇到附加回新 Activity 的问题。我只是提到这一点,不是因为你现在必须处理它,而是让你知道。

于 2012-04-25T01:12:06.977 回答
0

您从线程中获得了 listOfMessages 的结果,但您没有将该列表发布到您的收件箱 TextView。线程可能需要一段时间才能完全执行,但代码

inbox.setText(listOfMessages);

一旦线程启动,底部将执行。

所以,你需要调用 inbox.setText(listOfMessages); 一旦你的线程得到了最新的 listOfMessages。但是,您不能在非 ui 线程中执行任何 UI 操作(如 setText)。

有很多选择: 1.您可以使用处理程序类,在您的线程代码中,当您获得 listOfMessages 时,您可以使用处理程序并将消息发布到您的 UI 线程。您可以谷歌处理程序的样本。

  1. 如果上面的代码在您的活动中,您可以在活动中使用调用 runOnUiThread 的辅助方法。这有点像。

    MyActivity.this.runOnUiThread(new Runnable() { inbox.setText(listOfMessages); });

希望这会帮助你。

于 2012-04-25T00:44:08.283 回答