0

ソケットを介してサーバーに接続するAndroidアプリケーションを構築しています。ただし、メインスレッドをロックし、アンドロイドがそれを許可しないため、ワーカー接続スレッドからメインスレッドに通知することはできません。ここに私が持っている次のコードがあります:

接続コントローラーの一部:

public void run(){
    while (true){
        while (isRunning){
            if (serverSocket == null){
                try{
                    serverSocket = new Socket("*", *);
                    out = new PrintWriter(serverSocket.getOutputStream(), true);
                    in = new BufferedReader(new InputStreamReader(
                            serverSocket.getInputStream()));
                }
                catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (message != ""){
                try{
                        System.out.println(message);
                        out.println(message);
                        message = "";
                        reply = in.readLine();  
                        isRunning = false;                                          
                }
                catch (IOException e)   {
                    e.printStackTrace();
                }
            }               
        }
    }
}

public void sendMessage(String path,
        HashMap<String, HashMap<String, String>> variables){
    this.reply = "";
    isRunning = true;
    String variablesJSON = JSONValue.toJSONString(variables);
    this.message = path + ":" + variablesJSON;

}

認証クラス:

public boolean register(String email, String password, String displayName)  {
    String path = "User.register";
    HashMap<String, String> variables = new HashMap<String, String>();
    HashMap<String, HashMap<String, String>> user = new HashMap<String, HashMap<String, String>>();
    String hashedPass;
    try{
        hashedPass = sha1(password);
    }
    catch (NoSuchAlgorithmException e){
        e.printStackTrace();
        return false;
    }
    variables.put("displayname", displayName);
    variables.put("password", hashedPass);
    variables.put("email", email);
    user.put("User", variables); 

    connection.sendMessage(path, user, this);

    final ProgressDialog progDailog = ProgressDialog.show(context,
            "Please wait..", "Register", true);
    new Thread(){
        public void run(){
            try{
                while (ConnectionController.getInstance().getIsRunning()){
                    sleep(200);
                }
                progDailog.dismiss();
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }.start();

    Toast.makeText(context.getApplicationContext(),
            ConnectionController.getInstance().getReply(), Toast.LENGTH_LONG)
            .show();
    if (ConnectionController.getInstance().getReply() != "SUCCESS"){
        return false;
    }
    return true;

}

ProgressDialog が終了するのを待つ必要がありますが、方法が見つかりません。接続は常に開いている必要があるため、これを行うには AsyncTask が正しい方法ではないと思います。ヒントやアイデアはありますか?

4

1 に答える 1