为什么我不能从startActivityForResult取回结果?

时间:2019-09-16 17:07:46

标签: android android-activity startactivityforresult

我有一个类LogBeerActivity扩展了AppCompatActivity并具有以下两种方法:

public void gotoAddBrewery(View view) {
    String breweryNameEntered = breweryTextView.getText().toString();
    Intent intent = new Intent(this, AddBreweryActivity.class);
    intent.putExtra(Constants.EXTRAS_ID_BREWERY_NAME, breweryNameEntered);
    startActivityForResult(intent, ADD_BREWERY_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG_LOG_BEER_ACTIVITY, "Got request result code: " + resultCode);
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case ADD_BREWERY_REQUEST_CODE:
            if (resultCode == RESULT_OK)
            {
                String breweryName = data.getStringExtra(AddBreweryActivity.BREWERY_NAME_CODE);
                breweryTextView.setText(breweryName);
            }
    }
}

另一个类AddBreweryActivity也扩展了AppCompatActivity,并在提交带有用户输入的表单时调用了此方法:

public void submitBrewery(View view) {
    EditText breweryLocationInput = findViewById(R.id.input_brewery_location);
    EditText breweryCountryInput = findViewById(R.id.input_brewery_country);
    if (breweryNameInput == null || breweryLocationInput == null || breweryCountryInput == null) {
        Log.e(TAG_ADD_BREWERY_ACTIVITY, "One of the inputs is null!");
        return;
    } else {
        String enteredBreweryName = breweryNameInput.getText().toString().trim();
        String enteredBreweryLocation = breweryLocationInput.getText().toString().trim();
        String enteredBreweryCountry = breweryCountryInput.getText().toString().trim();
        Log.d(TAG_ADD_BREWERY_ACTIVITY, "submitBeer clicked. Brewery: " + enteredBreweryName + " from: " + enteredBreweryLocation + " in: " + enteredBreweryCountry);
        if (!enteredBreweryName.isEmpty() && !enteredBreweryLocation.isEmpty() && !enteredBreweryCountry.isEmpty()) {
            NewBrewery newBrewery = new NewBrewery(enteredBreweryName, enteredBreweryLocation, enteredBreweryCountry);
            URL url = HttpHelper.getUrl(Constants.URL_BASE + Constants.URL_BREWERIES_PATH);
            Thread thread = new Thread(() -> {
                try {
                    HttpHelper.makeRequest(url, newBrewery, this);
                } catch (IOException e) {
                    Log.e(TAG_ADD_BREWERY_ACTIVITY, "Error trying to submit new brewery: ", e);
                    return;
                } catch (HttpHelper.UserNotLoggedInException e) {
                    Log.e(TAG_ADD_BREWERY_ACTIVITY, "Error trying to submit new brewery: ", e);
                    return;
                }
            });
            thread.start();
            Intent resultIndent = new Intent();
            resultIndent.putExtra(BREWERY_NAME_CODE, newBrewery.getName());
            setResult(Activity.RESULT_OK, resultIndent);
            finish();
        }
    }
}

但是,即使两个活动之间的流动按预期发生,onActivityResult方法也永远不会被调用。

编辑:我已经发现了。如果我注释掉对服务器进行HTTP请求的代码行(从以URL url = ...开头的行直到包含thread.start();开头的行,那么它就会起作用。这与开始有关吗?实际上,仅注释掉读取thread.start();的行就可以了,并且它可以工作(当然,没有发出http请求)。

3 个答案:

答案 0 :(得分:1)

尽管实现看起来不错,但感觉它没有进入IF条件。尝试注释掉您的代码,仅执行setResult并查看它是否在调用onActivityResult 例如

public void submitBrewery(View view) {
    Log.e(TAG,"Submitting setResult");
    Intent resultIndent = new Intent();
    resultIndent.putExtra(BREWERY_NAME_CODE, "BREWERY_NAME");
    setResult(Activity.RESULT_OK, resultIndent);
    finish();
}

尽管我知道您的问题已经解决,但我很好奇如果您尝试以下操作会发生什么:

Thread thread = new Thread(() -> {
                try {
                    HttpHelper.makeRequest(url, newBrewery, this);
                } catch (IOException e) {
                    Log.e(TAG_ADD_BREWERY_ACTIVITY, "Error trying to submit new brewery: ", e);
                    return;
                } catch (HttpHelper.UserNotLoggedInException e) {
                    Log.e(TAG_ADD_BREWERY_ACTIVITY, "Error trying to submit new brewery: ", e);
                    return;
                }

                AddBreweryActivity.this.runOnUiThread(new Runnable() {
                    public void run() {
                        Intent resultIndent = new Intent();
                        resultIndent.putExtra(BREWERY_NAME_CODE, newBrewery.getName());
                        setResult(Activity.RESULT_OK, resultIndent);
                        finish();
                    }
                });
            });
thread.start();

答案 1 :(得分:1)

对不起人们,但事实证明我只是个白痴...

在我的HttpHelper.makeRequest方法中,某个时候(也许是一年前,当我最后一次从事该项目时)发生了“黑客”行为,

LoginActivity.startLoginActivity(context);

依次是:

Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);

这当然会使整个返回结果偏离轨道,但是这并不明显,因为它将使您最终进入同一页面。黑客的原因是,这是在POST之后从服务器取回更新数据的简单方法...如果我在HttpHelper中注释掉该行,则一切正常(除非我必须更新本地数据容纳新的啤酒厂,但这是不同的任务。

我不确定是否应该删除整个问题,因为这对其他人不太可能...?

答案 2 :(得分:0)

您正在AddBreweryActivity创建一个新的Intent对象。不调用活动结果是正常的。 您应该获得当前意图,以通知结果哪个活动发送了意图对象。 如果您更改此代码行

Intent resultIndent = new Intent();

与此,

Intent resultIndent = getIntent();

它将向onActivityResult通知getIntent()来自LogBeerActivity的活动。