将startActivityForResult和onActivityResult包装在一个返回结果的函数中

时间:2013-03-21 16:23:37

标签: java android android-activity wait

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

谢谢!

2 个答案:

答案 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;
}