AlertDialog 响应的保持任务
Holding task for AlertDialog response
我想为 AlertDialog 响应保留一个任务。我知道 UI doInBackground 方法中的交互是违反规则的,但是在 onPreExecute 中不可能这样做。
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 来实现,但是我等不及警告对话框的任何响应,期望有一个 while 循环,我相信这确实效率不高。提示密码方法等待,我 return 一个布尔值。
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 的响应的信息,但它不符合我的目的:( I
感谢您的帮助!
拉克
只需使用Object.wait()
and 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();
}
}
我想为 AlertDialog 响应保留一个任务。我知道 UI doInBackground 方法中的交互是违反规则的,但是在 onPreExecute 中不可能这样做。
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 来实现,但是我等不及警告对话框的任何响应,期望有一个 while 循环,我相信这确实效率不高。提示密码方法等待,我 return 一个布尔值。
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 的响应的信息,但它不符合我的目的:( I
感谢您的帮助!
拉克
只需使用Object.wait()
and 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();
}
}