gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:27:45 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com