use*_*568 1 android udp settext android-asynctask
我正在开发一个UDP程序,但是我在申请setText时遇到了麻烦asynctask.基本上在UDP服务器上,我只是要求输入一个端口然后服务器应该连接到localhost和端口.TextView布局中间的A显示"当前未连接",当我单击连接到端口时,我希望它更改为"已连接".但是,它没有做任何事情.我试着四处寻找,但无法找到解决方案.如果有人能帮我弄清楚会非常感激的问题.
我的线程asynctask代码:编辑:setText取出doinbackground.但是,setText仍然没有功能.
public class ServerThread extends AsyncTask<String, String, String>{
TextView chatbox;
TextView amiconnected;
@Override
protected void onPreExecute(){
chatbox = (TextView) findViewById(R.id.textView2);
amiconnected = (TextView) findViewById(R.id.textView3);
PORT = Integer.parseInt(((EditText) findViewById(R.id.editText1)).getText().toString());
}
@Override
protected String doInBackground(String... arg0) {
//open socket at specified port on the local host
try {
socket = new DatagramSocket(PORT);
//listening
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
text2 = new String("Now you're connected.");
//convert received message to string
text1 = new String(buf, 0, packet.getLength());
//get client address from received packet
//client_addr = packet.getAddress();
//byte[] message = new byte[1024];
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return text2;
}
@Override
protected void onPostExecute(String text2) {
// TODO Auto-generated method stub
super.onPostExecute(text2);
chatbox.setText(text2);
}
Run Code Online (Sandbox Code Playgroud)
编辑:我的整个UDP服务器代码
package com.example.udpcomm;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Server extends Activity{
int PORT;
DatagramSocket socket;
InetAddress client_addr;
String text1;
String text2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
//chatbox = (TextView) findViewById(R.id.textView2);
Button connectButton = (Button) findViewById(R.id.connectserver);
connectButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
new ServerThread().execute();
}
});
}
//parameter string port (converted into int)
//onprogressupdate (inputting string (?) into TextView)
//on postexecute return null (?)
public class ServerThread extends AsyncTask<String, String, String>{
TextView chatbox;
TextView amiconnected;
@Override
protected void onPreExecute(){
chatbox = (TextView) findViewById(R.id.textView2);
amiconnected = (TextView) findViewById(R.id.textView3);
PORT = Integer.parseInt(((EditText) findViewById(R.id.editText1)).getText().toString());
}
@Override
protected String doInBackground(String... arg0) {
//open socket at specified port on the local host
try {
socket = new DatagramSocket(PORT);
//listening
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
text2 = new String("Now you're connected.");
//convert received message to string
text1 = new String(buf, 0, packet.getLength());
//get client address from received packet
//client_addr = packet.getAddress();
//byte[] message = new byte[1024];
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return text2;
}
@Override
protected void onPostExecute(String text2) {
// TODO Auto-generated method stub
super.onPostExecute(text2);
chatbox.setText(text2);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要将您的UI行为给onPreExecute()或onPostExecute()方法为doInBackground不能碰UI.我建议你回到你需要把在字符串或值TextView从doInBackground方法,然后将其应用到了TextView在onPostExecute()法.参考AsyncTask说明
| 归档时间: |
|
| 查看次数: |
7289 次 |
| 最近记录: |