2013-10-15 92 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的。只是爲了緩解我的發展和演示時間:)