2017-05-24 49 views
0

我想保留AlertDialog響應的任務。我知道doInBackground方法中的UI交互違反規則,但在onPreExecute中不可能這樣做。AlertDialog響應的保留任務

public static class AsyncMongoConnection extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... voids) { 
     JSch jSch = new JSch(); 
     try { 
      Properties config = new Properties(); 
      config.put("StrictHostKeyChecking", "false"); 

      Session session = jSch.getSession("username", "host-address", 22); 
      //session.setPassword("password"); 
      session.setConfig(config); 
      session.connect(); 
      session.setPortForwardingL(27017, "host-address", 27017); 

      MongoClient   mongoClient = new MongoClient(new ServerAddress("localhost", 27017), Collections.singletonList(MongoCredential.createScramSha1Credential("user", "authdb", "password".toCharArray()))); 
      FindIterable<Document> documents = mongoClient.getDatabase("database").getCollection("users").find(); 
      Log.d("MongoClient", documents.iterator().next().toJson()); 

     } catch (JSchException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

正如你所看到的,我想創建一個從本地設備到遠程主機地址的端口轉發。但是我想啓用StrictHostKeyChecking,因爲這是一個很大的安全問題,如果我不這樣做的話。我的問題是現在爲該會話實現一個UserInfo。如果我不想預先保存它,我需要提示用戶輸入密碼。如果遠程主機的指紋未知,我也不想創建一個警告用戶的對話框。在這種情況下,它不是。在實現中,我想使用promptPassword來實現,但是我不能等待alert對話框的任何響應,期望使用while循環,我相信這真的是效率不高。 promptPassword方法正在等待,我返回一個布爾值。

public class SSHUserInfo implements UserInfo { 

    private String passphase = null; 
    private String password = null; 
    private Context context = null; 

    public SSHUserInfo(Context context) { 
     this.context = context; 
    } 

    @Override 
    public String getPassphrase() { 
     return passphase; 
    } 

    @Override 
    public String getPassword() { 
     return password; 
    } 

    @Override 
    public boolean promptPassword(String s) { 

     return false; 
    } 

    @Override 
    public boolean promptPassphrase(String s) { 
     return false; 
    } 

    @Override 
    public boolean promptYesNo(String s) { 
     return false; 
    } 

    @Override 
    public void showMessage(String s) { 

    } 
} 

我已經通知有關實現等待AlertDialog一個迴應,但它不適合我的目的:(我

感謝您的幫助!

塔裏克

回答

0

只需使用Object.wait()Object.notify()

@Override 
public boolean promptPassword(String s) { 

    synchronized (someObject) { 
     // Notify GUI thread about password prompt 
     publishProgress(); 

     // wait for password prompt to be submitted 
     wait(); 
    } 

    return false; 
} 

@Override 
public void onProgressUpdate (Progress... values) 
{ 
    // Do password prompt here 

    // And tell background thread, that we have a password already 
    synchronized (someObject) { 
     notify(); 
    } 
} 
+0

謝謝你的awnser。瞭解了很多關於同步和等待/通知的信息。但是這種情況對我來說並不是最好的,我找到了一個解決方法。謝謝!!! – LenovoCrafter