我是Android的新手,并尝试创建将使用startActivityForResult和onActivityResult并返回结果的身份验证函数(在我的情况下,包含两个字符串的数组 - 来自登录屏幕的用户名和密码)。
这是我的代码(为用户名和密码返回null)
在主要活动中(调用authenticate()函数):
public String user;
public String pass;
public void startAuth(Intent i)
{
startActivityForResult(i, 1);
}
public String[] authenticate()
{
String[] ret = new String[2];
Intent i = new Intent(getApplicationContext(), LoginActivity.class);
startAuth(i);
ret[0] = i.getStringExtra("iUsername");
ret[1] = i.getStringExtra("iPassword");
return ret;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data.getExtras().containsKey("iUsername"))
{
user = data.getStringExtra("iUsername");
pass = data.getStringExtra("iPassword");
}
}
在loginActivity中:
public class LoginActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
Button loginButton = (Button) findViewById(R.id.btnLogin);
final EditText username = (EditText) findViewById(R.id.username_fill);
final EditText password = (EditText) findViewById(R.id.password_fill);
// Listening to Login Button
loginButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = getIntent();
i.putExtra("iUsername", username.getText().toString());
i.putExtra("iPassword", password.getText().toString());
setResult(RESULT_OK, i);
finish();
}
});
}
}
我知道我需要以某种方式等待onActivityResult回调,但我尝试了不同的解决方案(使用wait()和notify(),使用单例)但是无法让它工作......
我必须将它包装起来,而不是像这样使用它,因为我想在更大的代码中使用authenticate()函数。没有使用上述功能的任何解决方案也都可以。
谢谢!
答案 0 :(得分:0)
无论您在何处使用authenticate()
,您实际上并没有等待回复:
public void authenticate() // Changed return type to void
{
//String[] ret = new String[2];
Intent i = new Intent(getApplicationContext(), LoginActivity.class);
startAuth(i);
/*
* This code does nothing, the Intent you want is in onActivityResult()
ret[0] = i.getStringExtra("iUsername");
ret[1] = i.getStringExtra("iPassword");
return ret;
*/
}
你必须分解你的逻辑,以便在调用onActivityResult()
时,它会在authenticate()
停止的地方恢复。明白你不能在方法中恢复。
因此,您必须在一种方法结束时调用authenticate()
,无论您在何处使用ret
,现在必须是从onActivityResult()
调用的新方法。
答案 1 :(得分:0)
private final Object lock = new Object();
public synchronized void startAuth(Intent i)
{
m_intent = i;
Thread thread = new Thread()
{
@Override
public void run()
{
MainActivity.this.runOnUiThread(new Runnable()
{
public void run()
{
startActivityForResult(m_intent, 1);
}
});
}
};
thread.start();
}
// authenticate function
public String[] authenticate()
{
String[] ret = new String[2];
Intent i = new Intent(getApplicationContext(), LoginActivity.class);
startAuth(i);
// waiting for login
synchronized (lock)
{
try
{
lock.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
// writing results
ret[0] = m_sUser;
ret[1] = m_sPass;
return ret;
}