android - 为什么我的 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(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 方法永远不会被调用,即使两个 Activity 之间的流程按预期发生也是如此。

编辑:我有一个发现。如果我注释掉向我的服务器发出 HTTP 请求的代码行(从以 URL url = ... 开头的行开始,直到并包括以 thread.start() 开头的行; 然后它起作用了。是否与启动新线程有关,把事情搞砸了?实际上,只需注释掉 thread.start(); 这行就足够了并且它有效(当然,除了没有发出 http 请求)。

最佳答案

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

关于android - 为什么我的 startActivityForResult 没有返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57961467/

相关文章:

android - myFirstApp 不存在

android - MessageDialog 使用适用于 Android 的 Facebook SDK 意外关闭

java - fragment 选项菜单 - 在 fragment 堆栈中创建多个实例

android - 在没有完成()的情况下重新加载 Android 中的 Activity

android - 使用 "id"作为来自 FragmentActivity 的 "startActivityForResult"的 requestCode

android - "Error: The given sign-in provider is disabled for Firebase project."但我启用了 firebase google auth

android - 我可以自定义 firebase OTP 数字(默认 6 到 4)吗?

Android:闪屏问题

android - 为什么 startActivityForResult 不起作用?

android - 使用 startActivityForResult,如何在子 Activity 中获取 requestCode?