【问题标题】:Android update TextView with HandlerAndroid 用 Handler 更新 TextView
【发布时间】:2012-07-24 10:00:53
【问题描述】:

我在更新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吗?

【问题讨论】:

  • 您的代码看起来不错。它会给你一个错误信息吗?
  • 你能验证你是通过 Handler 接收消息吗?
  • 是的,我可以发送和接收数据,并且从处理程序接收数据也可以,它将数据设置到 textView 仅最后接收到的数据(整数)。服务器端应用程序发送从 1 到 20 个真实 I/O 的随机数,此时我的 android 应用程序只打印最后一个数字 20。所以我的问题是我必须在哪里调用方法 handler.postDelay(this, 1000);推迟 quea,这是否足够?那是解决方案吗?还是我必须做的更多?

标签: android textview handler


【解决方案1】:

我发现我的问题不是处理程序问题。我在开头发布的代码是正确的。问题在于我从 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;
        }
    }
}

【讨论】:

    【解决方案2】:

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

    名为 InterfaceData 的接口

    public void getData(int data);

    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;
                    }
                }
            }
        }
    

    【讨论】:

    • 我可以尝试,但这并不能回答我的问题,它也让我感到困惑:(。如果我已经使用 Handler 将数据传递给 UI,为什么还要创建一个接口????跨度>
    • 您将处理程序用作静态。这有什么问题吗?
    • 我尝试了你的方法,只是我稍微更改了代码。因为服务器发送整数(1,2,3..)而不是字符串(文本)。所以接口上的方法我改为 public void getData(final int data);但我在 interfaceData.getData(data); 处得到一个空指针异常;不,我没有处理程序蜂鸣的问题。 @dcanh121
    • 我没有看到您创建 IOThread 类。我假设您会将 Activity 实例传递给该类以初始化构造函数。无论如何,我在活动类中编辑了代码。
    • 我在 IOThread 类构造函数中也有两个参数。 public class IOThread extends Thread { private static final String TAG_IOThread = "IOThread"; public final BluetoothSocket bSocket; private final InputStream in; private finalOutputStream out; InterfaceData pData; public IOThread(BluetoothSocket socket, InterfaceData pData) { this.pData = pData; bSocket = socket; }@dcanh121
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多