我正在我的机器人上创建一个连接到我电脑上的服务器的客户端。我在列表视图中遇到问题。我想知道如何将它添加到我的“ ClientThread ”类中,以便我可以从套接字输入更新它。我无法找到方法,因为它只有在我将其添加到“ onCreate ”类中才有效但我不能在该类中使用套接字如果你可以帮助我 提前谢谢 。
package com.example.marcus.chatclient1;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Array;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Arrays;
public class chat extends Activity {
Handler han;
String string;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
final Button join = (Button) findViewById(R.id.joinButton);
final EditText nameT = (EditText) findViewById(R.id.editTextName);
join.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
join.setVisibility(View.INVISIBLE);
nameT.setVisibility(View.INVISIBLE);
new Thread(new ClientThread()).start();
final TextView errorT = (TextView) findViewById(R.id.errorText);
ListView lv = (ListView)findViewById(R.id.ChatList);
final ArrayList<String> StrAr = new ArrayList<String>();
StrAr.add("Welcome");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplication(), R.layout.activity_chat, StrAr);
lv.setAdapter(adapter);
han = new Handler(){
public void handleMessage(Message msg) {
StrAr.add(string);
}
};
}
});
}
class ClientThread implements Runnable {
public void run() {
Message message=Message.obtain();
Socket s;
try {
s = new Socket("192.168.0.15", 55555);
ObjectOutputStream o = new ObjectOutputStream(s.getOutputStream());
o.writeObject("Android");
int num = 0;
num++;
string = "Hello World >>" + num;
han.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
答案 0 :(得分:0)
您应该在ListView
的{{1}}中写下Activity
初始代码,因为您必须尽快向用户展示您的用户界面。
您可以使用onCreate
和Thread
类来获取套接字输入并将其更新为Handler
。每次从子线程中的套接字获得输入时,使用处理程序将消息发送到Activity的主线程以更新UI。
有关处理程序的详细信息,请阅读this。
答案 1 :(得分:0)
基本上,您无法在后台更改UI元素。 UI元素的所有更改必须在主线程(也称为UI线程)中完成。
解决此问题的最简单方法是使用处理程序。
声明处理程序作为您的类成员。 private Handler mHandler;
在onCreate
方法中实例化它。 mHandler = new Handler();
从现在开始,只要您需要对ListView
进行更改,请将您的代码包装在Runnable
中,然后通过{{1}将其发布到主要帖子中}
或者,您可以使用主要活动的mHandler.post(myrunnable);
。
How to update the text in the UI from the background thread in Android
是的,我无法弄清楚这是什么意思:runOnUiThread()