无法在Android中正确实现我的主题

时间:2012-04-25 00:34:14

标签: java android multithreading http httpclient

我正在尝试在启动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);

}

就像我上面所说,如果我删除我的线程代码,那么它的工作完美。关于我做错了什么的任何想法?这是我第一次使用线程,对任何新手的错误都很抱歉。

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

2 个答案:

答案 0 :(得分: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的问题。我只是提到这一点,不是因为你现在必须处理它,而是因为你知道。

答案 1 :(得分: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);});

  2. 希望这会对你有所帮助。