Android套接字重新连接到服务器

时间:2017-08-03 22:30:59

标签: android sockets android-asynctask

我正在构建一个使用Java服务器连接的Android应用程序(在计算机上)。 我有一个问题 - 当我发现没有与服务器连接时,我试图重新连接到服务器但它不起作用。 这是Client类代码:

public class Client extends AsyncTask {

    private final int port = 1978;
    private final String ip = "192.168.14.22";
    private Socket socket;
    private DataOutputStream output;
    private DataInputStream input;


   public Client() {

    }

    @Override
    protected Object doInBackground(Object[] objects) {
        try {
            socket = new Socket(ip, port);
            output = new DataOutputStream(socket.getOutputStream());
            input = new DataInputStream(socket.getInputStream());

            Log.d("Network c1", "Connected");
        } catch (IOException e) {
            socket = null;
            Log.d("Network c1", "Not connected");
        }
        return null;
    }

    public boolean checkConnection() {
        if (output == null)
            return false;
        try {
            output.writeUTF("abc");
            return true;
        } catch (IOException e) {
            return false;
        }
    }

    @Override
    protected void onProgressUpdate(Object[] values) {

    }

}

活动代码:

public class LogInActivity extends AppCompatActivity {

    Client client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_log_in);

        client = new Client();
        client.execute();

        //I used timer because it didn't work without it- That saied always 'not connected' message/Toast
        new CountDownTimer(5, 0) {

            public void onTick(long millisUntilFinished) {

            }

            public void onFinish() {
                check();
            }
        }.start();
    }

    private void check() {
        boolean isProcess;

        isProcess = !checkConnection();

        if (isProcess) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.Theme_AppCompat_Dialog_Alert);
            builder.setTitle(getResources().getString(R.string.app_name));
            builder.setMessage("Unable connect to the library");
            builder.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //See note 1.
                    check();
                }
            });
            builder.setCancelable(false);
            builder.show();
        }
    }

    public boolean checkConnection() {
        if (client.checkConnection()) {
            Toast.makeText(getApplicationContext(), "Connected to the library", Toast.LENGTH_SHORT).show();
            return true;
        } else {
            Toast.makeText(this, "Unable connect to the library", Toast.LENGTH_SHORT).show();
            return false;
        }
    }
}

注1: 问题出在这里。

在连接服务器/库之前,需要显示此对话框。

如果在应用开启之前服务器已启用,则check()方法效果很好,并且说“已成功连接”#39;而且对话框没有显示。

但是,如果应用程序启动时,服务器无法访问,并且稍后打开(并且可以访问) - check()方法无法正常工作并始终显示对话框。

有什么问题?

顺便说一句,我试图重新启动客户端AsyncTask Class,但我没有成功。 (我尝试close(true),然后再次excute(),但cancel()方法不起作用,并且是一个错误,表示在{ {1}}已经执行,它无法再次执行)

感谢。

1 个答案:

答案 0 :(得分:0)

您不应该定期检查连接(每隔几秒就像在此代码中一样)。 相反,你应该让操作系统为你做这件事,它在电池和CPU方面更可靠,更高效。

查看this answer