2013-10-15 94 views
0

我建立一个android应用程序,通过套接字连接到服务器。然而,我不能通知工作线程的主线程,因为它会锁定主线程,而android不允许这样做。下面是下面的代码,我有: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是正确的方式,因为连接需要始终打开。任何提示或想法?

+0

阅读[本文档](https://developer.android.com/training/multiple-threads/communicate-ui.html)。您可以在线程和处理程序实例中使用runnable来处理UI线程中的消息。 – grine4ka

回答

1

AsyncTask是处理这个问题的正确方法。所有你需要做的UI,在你的onPost方法中做。如果你想调用的活动异步和更新来自同一活动的意见,你可以

  1. 使用广播接收器
  2. 做的AsyncTask类内部类的活动逸岸。这样,类方法可以修改该活动的视图。

我使用技巧2,让事情工作。一旦我有他们的工作,我把AsyncTask了,并使用BroadcastReceiver的。只是为了缓解我的发展和演示时间:)