使用线程更新 Android UI [英] Updating Android UI using threads
问题描述
我正在编写一个 Android 聊天应用程序.我正在侦听连接并接收数据,我可以在 Log.d
中看到它,但是每当我尝试更新我的 UI 时,应用程序都会崩溃.
I am writing an Android Chat App. I am listening for connections and I receive data and I can see it in the Log.d
, but whenever I try to update my UI the application crashes.
代码片段:
private class chatReceiver implements Runnable {
@Override
public void run() {
try {
skt = new DatagramSocket(Integer.parseInt(Main.prefs.getString("port_number", "5432")));
DatagramPacket rcvPkt = new DatagramPacket(rcvBuf,rcvBuf.length);
String ack = "Hello from our SimpleUDPServer";
byte[] sndBuf = ack.getBytes();
while (true) {
Log.d("Server received: " ,"entered loop");
skt.receive(rcvPkt);
String rcvMsg = new String(rcvBuf, 0, rcvPkt.getLength(), "UTF-8");
Log.d("Server received: " ,"receiving" + rcvMsg);
if (rcvMsg != null) {
Log.d("Server received: " ,"not equal null");
// I want to update my UI here
}
DatagramPacket k = new DatagramPacket(sndBuf, sndBuf.length,
rcvPkt.getAddress(), rcvPkt.getPort());
skt.send(k);
Log.d("Server sent" ,ack);
}
} catch (IOException ex) {
Log.d("ThreadStart", "Error Starting thread" + ex.getStackTrace());
}
}
}
并更新我使用的用户界面:
and to update the UI I do use :
public static void updateUI(Bubble b, View itemView) {
TextView txt_display_name = (TextView) itemView
.findViewById(R.id.display_name);
txt_display_name.setText(b.getDisplay_name());
TextView txt_chat_body = (TextView) itemView
.findViewById(R.id.chat_body);
txt_chat_body.setText(b.getChat_body());
TextView txt_creation_date = (TextView) itemView
.findViewById(R.id.creation_date);
txt_creation_date.setText(b.getCreation_time());
}
应用程序不断崩溃.
推荐答案
您不能从后台线程触摸 UI 线程中的任何内容,要做到这一点,请使用 Handlers
,初始化你的后台 thread
传递给它一个 Handler
对象.当数据到达时使用 handler
向 UI 发送消息.在 UI 中,当来自后台 thread
的消息到来时,只需更新 Views
.
You cannot touch anything in the UI thread from a background thread, to do that use Handlers
, initialize your background thread
passing it a Handler
object. When data arrives to use the handler
to send a message to the UI. In the UI when the message from the background thread
comes, just update the Views
.
示例代码片段:
在后台线程中:
if(dataArrives){
Message msg = handler.obtainMessage();
msg.what = UPDATE_IMAGE;
msg.obj = bitmap;
msg.arg1 = index;
handler.sendMessage(msg);
}
在 UI 线程中:
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==UPDATE_IMAGE){
images.get(msg.arg1).setImageBitmap((Bitmap) msg.obj);
}
super.handleMessage(msg);
}
};
并将handler
传递给后台thread
.
这篇关于使用线程更新 Android UI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!