我正在编写一个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。
答案 0 :(得分:0)
尝试在OnThread中更改文字
runOnUiThread(new Runnable() {
public void run() {
text.setText("GS");
}
});