1

私はAndroidが初めてで、startActivityForResultとonActivityResultを使用して結果を返す認証関数を作成しようとしています(私の場合、2つの文字列の配列-ログイン画面からのユーザー名とパスワード)。

これが私のコードです(ユーザー名とパスワードに対して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() 関数を使用したいからです。上記の関数を使用しないソリューションも問題ありません..

ありがとう!

4

2 に答える 2

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 に答える
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()、1 つのメソッドの最後で呼び出す必要があり、使用した場所はどこretからでも呼び出す新しいメソッドにする必要がありますonActivityResult()

于 2013-03-21T16:35:35.747 に答える