我有一个类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
方法也永远不会被调用。
编辑:我已经发现了。如果我注释掉对服务器进行HTTP请求的代码行(从以URL url = ...
开头的行直到包含thread.start();
开头的行,那么它就会起作用。这与开始有关吗?实际上,仅注释掉读取thread.start();
的行就可以了,并且它可以工作(当然,没有发出http请求)。
答案 0 :(得分:1)
尽管实现看起来不错,但感觉它没有进入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();
答案 1 :(得分:1)
对不起人们,但事实证明我只是个白痴...
在我的HttpHelper.makeRequest方法中,某个时候(也许是一年前,当我最后一次从事该项目时)发生了“黑客”行为,
LoginActivity.startLoginActivity(context);
依次是:
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
这当然会使整个返回结果偏离轨道,但是这并不明显,因为它将使您最终进入同一页面。黑客的原因是,这是在POST之后从服务器取回更新数据的简单方法...如果我在HttpHelper中注释掉该行,则一切正常(除非我必须更新本地数据容纳新的啤酒厂,但这是不同的任务。
我不确定是否应该删除整个问题,因为这对其他人不太可能...?
答案 2 :(得分:0)
您正在AddBreweryActivity创建一个新的Intent对象。不调用活动结果是正常的。 您应该获得当前意图,以通知结果哪个活动发送了意图对象。 如果您更改此代码行
Intent resultIndent = new Intent();
与此,
Intent resultIndent = getIntent();
它将向onActivityResult
通知getIntent()来自LogBeerActivity的活动。