我试图用我的数据库中的数据来填充列表,方法是使用reformation进行调用。调用在一个方法中,该方法将响应Map到本地列表并返回它。问题是,本地列表在填充之前会被返回,因为调用是异步的,并且会返回一个空列表。响应本身拥有所需的所有数据。这个问题怎么解决?
调用方法的代码段
fragments = new LinkedHashMap<Integer, RowFragment>();
int subjectCount = this.getTeachers(jwt).size();
for(int i = 0; i < subjectCount; i++){
RowFragment fragment = new RowFragment();
fragments.put(i, fragment);
}
方法
public List<Teacher> getTeachers(String jwt){
APIService apiService = ApiServiceGenerator.createService(APIService.class, jwt);
Call<List<Teacher>> call = apiService.getTeachers();
List<Teacher> tempTeachers = new ArrayList<Teacher>();
call.enqueue(new Callback<List<Teacher>>(){
@Override
public void onResponse(Call<List<Teacher>> call, Response<List<Teacher>> response){
if(response.isSuccessful()){
if(response.body().isEmpty() != true){
tempTeachers.addAll(response.body());
}
else{
Toast.makeText(BrowseActivity.this, "You have no teachers assigned", Toast.LENGTH_SHORT).show();
}
}
else{
Toast.makeText(BrowseActivity.this, "You are not authorized, please log in again", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<List<Teacher>> call, Throwable err) {
Log.i("err", err.getMessage());
}
});
return tempTeachers;
}
回应
200 GET https://bakalaurinis.azurewebsites.net/studentmaterial
Content-Type:application/json; charset=utf-8
Date:Mon, 19 Apr 2021 19:50:06 GMT
Server:Microsoft-IIS/10.0
Set-Cookie:ARRAffinitySameSite=22a7daa836b64a8ce56c907737553d08297ff2e76cd06a1f52c29956b9a85c17;Path=/;HttpOnly;SameSite=None;Secure;Domain=bakalaurinis.azurewebsites.net
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:ASP.NET
[{"name":"teacher","surname":"teacher","subject":"teacher","userId":25,"schoolId":5},{"name":"teacher2","surname":"teacher2","subject":"Chemistry","userId":28,"schoolId":5},{"name":"teacher3","surname":"teacher3","subject":"Physics","userId":29,"schoolId":5},{"name":"teacher4","surname":"teacher4","subject":"Math","userId":30,"schoolId":5}]
教师班
public class Teacher {
public String name;
public String surname;
public String subject;
public int userId;
public int schoolId;
public Teacher(String name, String surname, String subject, int userId, int schoolId){
this.name = name;
this.surname = surname;
this.subject = subject;
this.userId = userId;
this.schoolId = schoolId;
}
}
调用可以是同步的,但是如果我理解正确的话,android会抛出一个异常吗?
1条答案
按热度按时间nhjlsmyf1#
如果你这样做,如果连接很弱怎么办?该值将为null/空。如果你想达到这样的效果,也许你需要使用coroutine等等,所以在这种情况下,你必须在方法中列出它们/获取所有这些值
onResponse
. 值将不为空。更改类型方法getTeachers
至void
```@Override
public void onResponse(Call<List> call, Response<List> response){
if(response.isSuccessful()){
if(response.body().isEmpty() != true){
tempTeachers.addAll(response.body());
//Do it here
fragments = new LinkedHashMap<Integer, RowFragment>();
final int subjectCount = tempTeachers.size();
}