2015-11-08 79 views
0

我正在使用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"

+1

根据你的代码,你没有关闭套接字,InputStream和OutputStream在finally块。请确认,你是否得到日志输出Log.d(“doinBackground”,“doin my stuff”);当你第二次点击? –

+0

我第二次没有收到doinbackground。第二次只有'Log.d(“dopreexecute”,“在这里做东西”); –

+0

您应该明确关闭套接字。服务器是否可能一次仅接受一个套接字连接,并且第一个套接字仍处于打开状态? – user1676075

回答

0

问题在这里,套接字连接需要在finally块的最后一个块内部关闭,方法是在doInBackground方法中。因为服务器一次只接受一个套接字。

此外,应使用finally块关闭InputStream,OutputStream和BufferReader。

因此,代码应该出现这样的内部doInBackground finally块,

finally { 
    if(socket != null) 
      in.close(); 
      out.close(); 
      reader.close(); 
      socket.close(); 
} 
+0

'因为服务器一次只接受一个套接字。'。这可能是一个事实。但这个客户永远不会回来。完成后关闭使用的套接字是很好的客户端行为。即使服务器接受更多的客户端。 – greenapps

相关问题