[英]wrapping startActivityForResult and onActivityResult in one function that returns result
我是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(),使用singleton),但無法使其正常工作...
我必須包裝它,而不要這樣使用它,因為我想在更大的代碼中使用authenticate()函數。 任何不使用上述功能的解決方案都可以。
謝謝!
無論您在哪里使用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()
調用的新方法。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.