1

我在更新时遇到问题TextView,我使用 Handler 方法将消息传递给 UI。我的应用程序接收数据(整数类型)真正的 io 流并显示在TextView.

我的 Activity 类如下所示:

public class DeviceView extends Activity {
    TextView dataX;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.device_view);

        dataX = (TextView) findViewById(R.id.datax);

        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                dataX.setText(String.valueOf(msg.arg1));
            }
        };

    }
}

我还有一个单独的类,它扩展了 Thread:

public class IOThread extends Thread {

    public void run() {
        byte[] buffer = new byte[1024];
        int data;
        while (true) {
            try {
                data = in.read(buffer);
                Message message= Message.obtain();
                message.arg1= data;
                DeviceView.handler.sendMessage(message);
            } catch (IOException ex) {
                break;
            }
        }
    }
}

我是否必须创建一个单独的变量类型String并将其指向变量数据并最后调用计数?这足以更新TextView吗?

4

2 回答 2

0

你可以尝试使用接口。让Activity实现它,传递给IOThread类。获得结果后,将结果传递给 Activity。

名为 InterfaceData 的接口

公共无效getData(int数据);

public class DeviceView extends Activity implements InterfaceData{

        TextView dataX;
        Handler handler;
        IOThread ioThread;
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.device_view);
            handler = new Handler();
            ioThread = new IOThread(this);
            dataX = (TextView) findViewById(R.id.datax);

        }

        @Override
        public void getData(int data){
           handler.postDelayed(new Runnable(){
           public void run(){
             dataX.setText(data);
            };
          },100);
        }

    }


> Thread class


    public class IOThread extends Thread {

       InterfaceData interfaceData;
       public IOThread(InterfaceData interfaceData){
         this.interfaceData = interfaceData;
       }

        public void run() {
            byte[] buffer = new byte[1024];
            int data;
            while (true) {
                try {
                    data = in.read(buffer);
                   interfaceData.getData(data);
                } catch (IOException ex) {
                    break;
                }
            }
        }
    }
于 2012-07-25T23:42:42.763 回答
0

我发现我的问题不是处理程序问题。我在开头发布的代码是正确的。问题在于我从 InputStream 读取接收到的 bytes[] 数组的方式。我已经通过发送一个整数进行了测试int numbers = (int) 2,当在 Android 应用程序的终端中打印这个接收数据时,它只接收到 1,即使我发送 int 3 或 4,我仍然接收到 1。

所以我很喜欢你的示例代码@dcanh121,但我的问题实际上是我如何正确读取服务器发送的整数?

public void run() {
byte[] buffer = new byte[1024];
int data;

while (true) {
    try {

        data = in.read(buffer);
                Log.d(TAG + data, "test");
        Message message = Message.obtain();
        message.arg1 = data;                
        Log.d(TAG + message.arg1, "test");
        DeviceView.handler.sendMessageDelayed(message, 100);

        } catch (IOException ex) {
        Log.e(TAG_IOThread, "disconnected", ex);
        break;
        }
    }
}
于 2012-07-27T22:32:30.623 回答