1

我是 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");
    }
}    

在登录活动中:

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() 函数。任何不使用上述功能的解决方案也可以..

谢谢!

4

2 回答 2

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()

于 2013-03-21T16:35:35.747 回答
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;
} 
于 2013-03-24T15:48:40.403 回答