Java 为什么双击android客户端会收到数据?
当我第一次点击登录按钮时,数据发送到服务器,服务器收到第一次点击时返回的数据数据不显示在android客户端屏幕上。当我再次按下登录按钮时,它再次发送数据,然后在客户端屏幕上显示数据。。。请帮帮我。为什么在第二次单击时接收数据我希望在第一次单击时接收数据? 代码如下: 客户端tcpip代码Java 为什么双击android客户端会收到数据?,java,android,sockets,Java,Android,Sockets,当我第一次点击登录按钮时,数据发送到服务器,服务器收到第一次点击时返回的数据数据不显示在android客户端屏幕上。当我再次按下登录按钮时,它再次发送数据,然后在客户端屏幕上显示数据。。。请帮帮我。为什么在第二次单击时接收数据我希望在第一次单击时接收数据? 代码如下: 客户端tcpip代码 public class SockProg { private Socket socket; DataOutputStream dataOutputStream; DataI
public class SockProg {
private Socket socket;
DataOutputStream dataOutputStream;
DataInputStream dataInputStream;
String data;
String serverip = "192.168.1.7";
int serverport = 4444;
public void connetToServer(){
try {
socket = new Socket(serverip, serverport);
Log.i("AsyncTank", "doInBackgoung: Created Socket");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (socket.isConnected()) {
try {
dataOutputStream = new DataOutputStream(
socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void writeToStream(String message) {
try {
if (socket.isConnected()){
dataOutputStream.writeUTF(message.toString());
} else {
Log.i("AsynkTask", "writeToStream : Cannot write to stream, Socket is closed");
}
} catch (Exception e) {
Log.i("AsynkTask", "writeToStream : Writing failed");
}
}
public String readFromStream() {
String ret = null;
try {
if (socket.isConnected()) {
Log.i("AsynkTask", "readFromStream : Reading message");
ret=dataInputStream.readUTF();
Log.i("AsynkTask", "readFromStream : read "+ret);
} else {
Log.i("AsynkTask", "readFromStream : Cannot Read, Socket is closed");
}
} catch (Exception e) {
Log.i("AsynkTask", "readFromStream : Reading failed"+e.getClass());
}
return ret;
}
public void CloseSockets(){
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataOutputStream != null) {
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataInputStream != null) {
try {
dataInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这是同步线程的代码
public class TCP implements Runnable {
String data;
SockProg sp;
Thread thh;
private static String rdata;
public TCP(SockProg spr, String val) {
sp = spr;
data = val;
thh = new Thread(this);
thh.start();
}
@Override
public void run() {
synchronized(sp) { // synchronized block
//rdata= sp.DataSendRecive(data);
sp.connetToServer();
sp.writeToStream(data);
rdata=sp.readFromStream();
sp.CloseSockets();
}
}
public static String getData(){
return rdata;
}
}
这是登录活动的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
msg = (TextView) findViewById(R.id.msg_log);
login = (Button) findViewById(R.id.btn_login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// try{
txtph = (EditText) findViewById(R.id.txt_phnum);
txtpass = (EditText) findViewById(R.id.txt_pass);
ph = txtph.getText().toString();
pass = txtpass.getText().toString();
int ch = 0;
if (ph.equals("") || ph == null) {
msg.setText("Please Enter Mobile Number....\n");
ch++;
}
if (pass.equals("") || pass == null) {
if (ch == 0) {
msg.setText("Please Enter your Password....\n");
} else {
msg.append("Please Enter your Password....\n");
}
ch++;
}
if (ch == 0) {
ArrayList<String> ph_pass = new ArrayList<String>();
ph_pass.add(0, "LoginAccount");
ph_pass.add(1, ph);
ph_pass.add(2, pass);
SockProg sp=new SockProg();
TCP t=new TCP(sp, ph_pass.toString());
data=t.getData();
msg.setText(data);
}
}
});
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u登录);
msg=(TextView)findViewById(R.id.msg_log);
login=(按钮)findviewbyd(R.id.btn\u login);
login.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//试一试{
txtph=(EditText)findViewById(R.id.txt_phnum);
txtpass=(EditText)findViewById(R.id.txt\u pass);
ph=txtph.getText().toString();
pass=txtpass.getText().toString();
int ch=0;
如果(ph.equals(“”| | ph==null){
msg.setText(“请输入手机号码…”\n);
ch++;
}
if(pass.equals(“”| | pass==null){
如果(ch==0){
msg.setText(“请输入您的密码…”\n);
}否则{
msg.append(“请输入您的密码…”\n);
}
ch++;
}
如果(ch==0){
ArrayList ph_pass=新的ArrayList();
ph_pass.添加(0,“登录计数”);
ph_通过。添加(1,ph);
PHU通行证。添加(2,通行证);
SockProg sp=新的SockProg();
TCP t=新TCP(sp,ph_pass.toString());
data=t.getData();
msg.setText(数据);
}
}
});
}
这看起来像是异步编码延迟的典型情况。TCP类是可运行的,因此当第一次调用它时(第一次单击登录按钮),它开始运行,但线程没有足够的时间来完成
rdata=sp.readFromStream();
在run()方法中,因此data=t.getData();
不会返回任何有用的内容。第二次单击为runnable提供了足够的时间,以便用一些数据填充rdata,从而使程序正常工作
当使用异步代码时,您需要一种更好的方法来等待代码完成它正在做的事情
为什么rdata是静态类型?将其设置为非静态,然后更改getData()方法,如下所示:
public synchronized String getData()
我明白你说的…但在我第一次点击时,我希望收到服务器发送的数据..你建议我在代码中做些什么更改吗?是的,阅读我文章的最后一行,使rdata非静态,并使getData方法同步我按照你说的做了,但结果是一样的…:(