我正在使用AsyncTask
以通过套接字联系用java编写的服务器并确认android客户端发送的用户/密码。即使认为postexecute被调用,AsyncTask也不会运行多次
我第一次点击登录按钮它的工作,但第二次,异步任务只能到onPreExec()
,而不是更进一步。
我已经在网上搜索过,但我只找到问题,为什么它不能在第一次或如何在同一时间运行多个。但我不想运行多个AsyncTasks
,因为它不是必需的。
这是我如何调用AsyncTask
:
new LoginAsyncTask(this, user, password).execute();
这是LoginAsyncTask
类:
package com.course.chat;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class LoginAsyncTask extends AsyncTask<Void, Void, Void> {
private ActivityLogin main;
private String loginResult, user, password;
public LoginAsyncTask(ActivityLogin main, String user, String password){
super();
Log.d("constructor", "ay ay");
this.main = main;
this.user = user;
this.password = password;
}
@Override
protected void onPreExecute() {
Log.d("dopreexecute", "doing stuff here also");
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
Log.d("doinBackground", "doin my stuff");
try{
Socket socket = new Socket("79.119.139.180", 6969);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
PrintStream ps = new PrintStream(out);
ps.println(user + "," + password);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while((line = reader.readLine()) != null){
Log.d("doinbackground", line);
if (line.equals("OK")) {
loginResult = "OK";
break;
}
else if (line.equals("FAIL")) {
loginResult = "FAIL";
break;
}
}
} catch(Exception e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.d("onPostExecute", "doing my stuff");
if(loginResult.equals("OK"))
Toast.makeText(main, "Signed in", Toast.LENGTH_LONG).show();
else if(loginResult.equals("FAIL"))
Toast.makeText(main, "Invalid user or password", Toast.LENGTH_LONG).show();
}
}
起初我以为这可能是因为没有完成最后一个,但这当然是因为它向我展示了"OK"
或"FAIL"
。
根据你的代码,你没有关闭套接字,InputStream和OutputStream在finally块。请确认,你是否得到日志输出Log.d(“doinBackground”,“doin my stuff”);当你第二次点击? –
我第二次没有收到doinbackground。第二次只有'Log.d(“dopreexecute”,“在这里做东西”); –
您应该明确关闭套接字。服务器是否可能一次仅接受一个套接字连接,并且第一个套接字仍处于打开状态? – user1676075