我有一个RestService,它提供了其他服务链接的列表。
虽然我需要处理每个serviceUrl并获取包含类型和值的对象。我的最终列表将是图像,NameOfTheRestObject,值,类型。
为此,在获取restobject之后,我要遍历每个对象,然后使用AsyncTask
执行get方法。但是这样做时,向不同的服务发出请求,Activity变得缓慢,或者有时由于请求之一,应用程序完全崩溃,而不是返回单个请求的null。如果我没有在for循环中添加get()
,则循环将继续进行,而不会从服务中获取数据。
关于如何改善这一点的任何建议?
{
"id": 1,
"name": "Name of the Method",
"serviceUrl": "/api/StatisticMethod/Statistic1",
"imageUrl": "fa-tree.png",
"isActive": true
}
DataValue dv = new getStatistics().execute(serviceUrl).get();
private class getStatistics extends AsyncTask<String, DataValue, DataValue> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected DataValue doInBackground(String... arg0) {
HttpHandler sh = new HttpHandler();
valueData = new DataValue("", "");
String url = arg0[0];
String data = sh.makeServiceCall(url, true, context);
try {
if (!AppHelper.isNullOrEmpty(data)) {
JSONObject js = new JSONObject(data);
String value = js.getString("value");
String valueType = js.getString("valueType");
valueData = new DataValue(value, valueType);
return valueData;
}
} catch (Exception ex) {
Log.e(TAG, "doInBackground: ", ex);
return valueData;
}
return valueData;
}
@Override
protected void onPostExecute(DataValue result) {
super.onPostExecute(result);
}
}
`
答案 0 :(得分:1)
可能由于调用.get()
而滞后-如果您要通过这种方式进行操作,则必须异步地回叫 ,这需要定义一个{{1 }},并将其实现的实例传递到interface
的构造函数中(例如,一旦知道调用次数,为了显示进度条)。更好地使用Retrofit并使用GSON转换器映射模型类。如果所有响应看起来都相同,则只需一个模型即可,否则每种响应都需要一个模型。给定示例JSON,其外观如下所示:
AsyncTask
类import com.google.gson.annotations.SerializedName;
import androidx.annotation.NonNull;
public class Device {
@SerializedName("id")
private int id;
@SerializedName("name")
private String name;
@SerializedName("serviceUrl")
private String serviceUrl;
@SerializedName("imageUrl")
private String imageUrl;
@SerializedName("isActive")
private boolean isActive;
public void setId(@NonNull int value) {
this.id = value;
}
public void setName(@NonNull String value) {
this.name = value;
}
public void setServiceUrl(@NonNull String value) {
this.serviceUrl = value;
}
public void setImageUrl(@NonNull String value) {
this.imageUrl = value;
}
public void setIsActive(@NonNull boolean value) {
this.isActive = value;
}
@NonNull
public int getId() {
return this.id;
}
@NonNull
public String getName() {
return this.name;
}
@NonNull
public String getServiceUrl() {
return this.serviceUrl;
}
@NonNull
public String getImageUrl() {
return this.imageUrl;
}
@NonNull
public boolean getIsActive() {
return this.isActive;
}
}
也是如此。