将ListView添加到我的客户端

时间:2015-12-13 07:27:44

标签: android sockets android-listview

我正在我的机器人上创建一个连接到我电脑上的服务器的客户端。我在列表视图中遇到问题。我想知道如何将它添加到我的 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();
        }
    }
}
}

2 个答案:

答案 0 :(得分:0)

您应该在ListView的{​​{1}}中写下Activity初始代码,因为您必须尽快向用户展示您的用户界面。

您可以使用onCreateThread类来获取套接字输入并将其更新为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()