我对android和java还是很陌生,我通过单击列表视图中的项目从Internet提取了一些数据,但是我需要2次致电才能获得所需的信息。当我从第一个调用中获取int值时,我将其传递给第二个方法,该方法将自己进行调用,获取一个值,并将其放入SharedPref中。当我尝试以第一种方法取回数据时,它首先返回默认值“”,但是当我单击第二项时,它显示应该是第一次调用的结果,在第三次单击时,它显示第二个结果,等等...
我尝试使用数据库,现在尝试使用SharedPref,结果始终相同。试图将方法调用放入线程中,仍然相同...
这是我的第一种方法,它调用第二种方法,称为花钱类别
private void listViewFunction() {
lvItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int userId = arrayList.get(position).idUser;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TrikoderAPI trikoderAPI = retrofit.create(TrikoderAPI.class);
Call<SingleFeed> call = trikoderAPI.getSingleFeed(userId);
call.enqueue(new Callback<SingleFeed>() {
@Override
public void onResponse(Call<SingleFeed> call, Response<SingleFeed> response) {
SingleFeed data = response.body();
final int categoryId = data.getData().getRelationships().getSpendingCategory().getData().getId();
spendingCategory(categoryId);
String info;
info = sp.getString(CATEGORY_NAME, "");
String result = getString(R.string.type) + data.getData().getType() + "\n"
+ getString(R.string.id) + data.getData().getId() + "\n"
+ getString(R.string.amount) + data.getData().getAttributes().getAmount() + "\n"
+ getString(R.string.remark) + data.getData().getAttributes().getRemark() + "\n"
+ getString(R.string.name) + data.getData().getAttributes().getName() + "\n"
+ getString(R.string.date) + data.getData().getAttributes().getDate() + "\n"
+ getString(R.string.category) + info;
popUpWindow(result);
editor.clear();
editor.commit();
}
@Override
public void onFailure(Call<SingleFeed> call, Throwable t) {
Toast.makeText(MainActivity.this, getString(R.string.somethingWrong) + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
这是第二种方法
private void spendingCategory(int categoryId) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TrikoderAPI trikoderAPI = retrofit.create(TrikoderAPI.class);
Call<SingleCategory> call = trikoderAPI.getCategoryFeed(categoryId);
call.enqueue(new Callback<SingleCategory>() {
@Override
public void onResponse(Call<SingleCategory> call, Response<SingleCategory> response) {
SingleCategory data = response.body();
String result = data.getData().getAttributes().getName();
Log.d(TAG, "onResponse: " + result);
sp.edit().putString(CATEGORY_NAME, result).apply();
@Override
public void onFailure(Call<SingleCategory> call, Throwable t) {
Toast.makeText(MainActivity.this, getString(R.string.somethingWrong), Toast.LENGTH_SHORT).show();
}
});
}
我希望第一个输出是结果字符串的值,而不是我从SharedPref获得的默认值
答案 0 :(得分:0)
对此进行检查:
spendingCategory(categoryId,data);
现在,在支出类别的网络调用内的代码下方移动,将此代码放入:
String result = getString(R.string.type) + data.getData().getType() + "\n"
+ getString(R.string.id) + data.getData().getId() + "\n"
+ getString(R.string.amount) + data.getData().getAttributes().getAmount() + "\n"
+ getString(R.string.remark) + data.getData().getAttributes().getRemark() + "\n"
+ getString(R.string.name) + data.getData().getAttributes().getName() + "\n"
+ getString(R.string.date) + data.getData().getAttributes().getDate() + "\n"
+ getString(R.string.category) + info;
String result2 = data2.getData().getAttributes().getName();
Log.d(TAG, "onResponse: " + result2);
sp.edit().putString(CATEGORY_NAME, result2).apply();
String info;
info = sp.getString(CATEGORY_NAME, "");
答案 1 :(得分:0)
SharedPreference.apply()-此方法异步(以后)保存更改。
SharedPreference.commit()-此方法是同步的(立即)。
Retrofit enqueue()是异步调用。因此,您不能确定执行顺序。
对于您的问题,您必须在第二个方法调用响应(即支出类别)之后执行操作
将方法更改为
spendingCategory(int categoryId,SingleFeed data)
在onResponse()中添加以下代码
...
String result = data.getData().getAttributes().getName();
Log.d(TAG, "onResponse: " + result);
sp.edit().putString(CATEGORY_NAME, result).commit();
String info;
info = sp.getString(CATEGORY_NAME, "");
String result = getString(R.string.type) + data.getData().getType() + "\n"
+ getString(R.string.id) + data.getData().getId() + "\n"
+ getString(R.string.amount) +
data.getData().getAttributes().getAmount() + "\n"
+ getString(R.string.remark) +
data.getData().getAttributes().getRemark() + "\n"
+ getString(R.string.name) +
data.getData().getAttributes().getName() + "\n"
+ getString(R.string.date) +
data.getData().getAttributes().getDate() + "\n"
getString(R.string.category) + info;
popUpWindow(result);
editor.clear();
editor.commit();
我认为通过上述实现,您不需要上述调用的共享首选项。