即使认为postexecute被调用,AsyncTask也不会多次运行

时间:2015-11-08 16:08:47

标签: android

我正在使用AsyncTask来通过套接字联系用java编写的服务器,并确认我的用户/密码是Android客户端发送的。

我第一次点击登录按钮时它可以正常工作,但第二次,异步任务只能到达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 个答案:

答案 0 :(得分:0)

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

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

所以代码应该在doInBackground finally块中出现,

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