簡體   English   中英

將startActivityForResult和onActivityResult包裝在一個返回結果的函數中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM