我正在尝试在启动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);
}
就像我上面所说,如果我删除我的线程代码,那么它的工作完美。关于我做错了什么的任何想法?这是我第一次使用线程,对任何新手的错误都很抱歉。
我没有得到任何错误(至少我没有看到任何错误)但是,如果没有插入线程代码,我看不到输出。
答案 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线程。你可以谷歌处理样品。
如果上面的代码在您的活动中,您可以在活动中使用辅助方法调用runOnUiThread。这就像是。
MyActivity.this.runOnUiThread(new Runnable(){inbox.setText(listOfMessages);});
希望这会对你有所帮助。