Android 为什么我不能从startActivityForResult获得结果?

Android 为什么我不能从startActivityForResult获得结果?,android,android-activity,startactivityforresult,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(Con

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

另一个类
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=…
开始,直到并包括
thread.start()开始)
然后它就工作了。这与启动新线程有关吗?事实上,只需注释掉读取
thread.start();
的行就足够了,它就工作了(当然,除了没有发出http请求).

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

Intent resultIndent = new Intent();
用这个,

Intent resultIndent = getIntent();

它将通知getIntent()来自LogBeePractivity的活动的
onActivityResult

虽然实现看起来很好,但感觉好像没有进入IF条件。尝试注释代码,只执行setResult,看看它是否在调用onActivityResult e、 g


虽然我知道你的问题已经解决了,但我很好奇如果你尝试以下方法会发生什么:

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);
这当然会破坏整个返回结果,但这并不明显,因为它会让你在同一个页面上结束。黑客攻击的原因是,这是一种在发布后从服务器获取更新数据的简单方法……如果我在HttpHelper中注释掉这一行,一切都很好(除非我必须更新本地数据以包含新的酿酒厂,但这是一项不同的任务)


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

startActivityForResult imp.看起来正确您所说的“不返回结果”到底是什么意思?
onActivityResult()
只是没有运行?或者您没有在那里获得预期的数据?
onActivityResult
没有被调用。调试行没有打印,如果我在其中放置一行,它也不会遇到断点。
ADD\u BREWERY\u REQUEST\u code
的值是多少?它过去是
1
,但作为测试,我在中已将其更改为
111
最新版本的代码。我可以尝试一下,但它肯定会在那里。我在那里有一些检查点被命中,而且HTTP请求也能正常通过。奇怪的是,当我将其更改为此时,我确实会返回结果(调用onActivityResult)。但我不明白为什么(正如我提到的,setResult和finish代码也在我的版本中实现了…@SvendHansen,我已经更新了我的答案,希望您尝试一下代码谢谢,@Sahil!我会在有时间的时候尝试一下(可能不会几天,因为我会很忙)。听起来是个不错的主意,因为它会等到Http请求完成后再返回结果(并允许处理来自服务器的错误):)是的,这很有效。虽然你没有直接指出最初的问题(我甚至没有共享代码,你怎么能这样做),你的建议确实让我发现了这一点,而你的第二个建议正是我需要做的,以便能够等待请求的成功。因此,我也给了你奖金:)不幸的是,这似乎没有解决它。它的行为仍然是一样的。你认为如果我发布整个两个类会有什么不同吗?而且,我看到的示例似乎都是
newintent()
。但是,他们通常在onCreate中执行此操作,如下所示:我在提交表单时调用的方法中执行此操作。无法在onCreate中执行此操作,因为此时我还无法从用户那里获得要传回的数据…:P
LoginActivity.startLoginActivity(context);
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);