为什么我的 startActivityForResult 没有返回结果?

Why do I not get the result back from my startActivityForResult?

我有一个 class 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);
            }
    }
}

另一个 class 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 请求)。

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

Intent resultIndent = new Intent();

有了这个,

Intent resultIndent = getIntent();

它将通知 onActivityResult activity getIntent() 来自 LogBeerActivity。

虽然实现看起来不错,但感觉它没有进入 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();

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

在我的 HttpHelper.makeRequest 方法中,我在某个时候(可能是一年前,当我最后一次处理该项目时)放入了一个 "hack" :

LoginActivity.startLoginActivity(context);

这反过来又做了:

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

这当然会破坏整个返回的结果,但它不会很明显,因为它会让你在同一页面上结束。黑客入侵的原因是,这是在 POST 之后从服务器获取更新数据的一种简单方法...如果我在 HttpHelper 中注释掉该行,一切正常(除了我必须更新本地数据以包含新啤酒厂,但这是另一项任务)。

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