EditText在Async任务中不一致地更新

时间:2013-12-13 11:46:43

标签: android asynchronous android-edittext

我正在编写一个Android应用程序,它使用视频视频播放视频文件,并通过UDP数据包从另一台设备接收数据,并在显示屏上更新信息。我需要在播放视频时将显示设置为横向,但这样做不会按预期更新显示。这在画像中偶尔会发生,但每次都可以通过设置为横向来重新创建问题。

希望下面的简短示例可以解释这个问题。它使用ASync任务在端口2222上侦听消息,然后在收到编辑文本时更新它。

public class UDPTest extends Activity {

EditText udpMessage;

@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setContentView(R.layout.main);
    udpMessage = (EditText) findViewById(R.id.udpMessage);
    new myAsyncServer().execute(); 
}   

private class myAsyncServer extends AsyncTask<Void, String, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        String udpRecieved = null;
        byte[] udpMsg = new byte[1000];
        DatagramPacket dPacket = new DatagramPacket(udpMsg, udpMsg.length);
        DatagramSocket dSocket = null;
        try {
            dSocket = new DatagramSocket(2222);
            Log.e("Async", "Before");
            dSocket.receive(dPacket);
            Log.e("Async", "After");

            udpRecieved = new String(udpMsg, 0, dPacket.getLength());
            Log.e("Packet received", udpRecieved);
            publishProgress(udpRecieved);

        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (dSocket != null) {
                dSocket.close();
            }
        }  
        return null;   
    }   

    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);     
        Log.e("In OnProgress", values[0]);
        udpMessage.setText(values[0]);
    }     
}   

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".UDPTest" >

<EditText
    android:id="@+id/udpMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:textColor="#FF0000"
    android:ems="10" />

未定义屏幕方向(setRequestedOrientation已注释掉),运行程序,通过端口2222将数据包发送到设备IP地址(我使用PacketSender),编辑文本立即更新。将方向设置为横向,即取消注释setRequestedOrientation),必须在更新edittext之前发送数据包2或3次。

从插入代码的日志消息中我可以看到,每次发送数据包时,都会收到数据包和消息(我发送'帮助'),onProgressUpdate调用正确的消息,但edittext不会更改。< / p>

来自纵向视图的LogCat显示:

12-13 10:11:56.123: E/Async     (32111) : Before

Send packet

12-13 10:12:06.738: E/Async     (32111) : After

12-13 10:12:06.743: E/Packet received   (32111) : Help

12-13 10:12:06.743: E/In OnProgress (32111) : Help

EditText updated

来自横向视图的LogCat是:

12-13 10:39:57.163: E/Async     (4328): Before

Send packet

12-13 10:40:03.188: E/Async     (4328): After

12-13 10:40:03.188: E/Packet received   (4328): Help

12-13 10:40:03.193: E/In OnProgress (4328): Help

12-13 10:40:03.193: E/Async     (4328): Before

EditText not updated 

Send packet again   

12-13 10:40:06.463: E/Async     (4328): After

12-13 10:40:06.463: E/Packet received   (4328): Help

12-13 10:40:06.463: E/In OnProgress (4328): Help

Edit text updated

我不认为这与屏幕方向完全相关,但无法弄清楚原因。

编辑: 我实际上可以排除UDP数据包的这一部分。如果我只是删除doInBackground中的所有代码并替换为

         Log.e("Async", "Before");
         publishProgress("Test");
         Log.e("Async", "After");

同样的事情发生了。设置为纵向,doInBackground中的代码执行一次,调用onProgressUpdate,更改edittext并且日志反映出来。设置为Landscape时,代码执行两次,onProgressUpdate调用两次,第二次只更新edittext。

1 个答案:

答案 0 :(得分:0)

尝试在OnThread中更改文字

runOnUiThread(new Runnable() {
            public void run() {
            text.setText("GS"); 
            }
        });