为什么我的 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 中注释掉该行,一切正常(除了我必须更新本地数据以包含新啤酒厂,但这是另一项任务)。
我不确定是否应该删除整个问题,因为它不太可能对其他人有用...?
我有一个 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 中注释掉该行,一切正常(除了我必须更新本地数据以包含新啤酒厂,但这是另一项任务)。
我不确定是否应该删除整个问题,因为它不太可能对其他人有用...?