在android上创建对webservice的多个请求
我有一个RestService,它提供了另一个服务链接的列表 而我需要处理每个serviceUrl并获取其包含类型和值的对象。我的最终列表将是图像、对象名称、值和类型。 为此,在获取restobject之后,我将遍历每个对象,然后使用AsyncTask执行get方法。但在执行此操作时,向不同的服务发出请求,活动变得滞后,或者有时由于其中一个请求,应用程序完全崩溃,而不是返回单个请求的null。如果我不添加get at for循环,循环将继续,而不从服务获取数据。 对于如何改进这一点,有什么建议吗在android上创建对webservice的多个请求,android,rest,asynchronous,Android,Rest,Asynchronous,我有一个RestService,它提供了另一个服务链接的列表 而我需要处理每个serviceUrl并获取其包含类型和值的对象。我的最终列表将是图像、对象名称、值和类型。 为此,在获取restobject之后,我将遍历每个对象,然后使用AsyncTask执行get方法。但在执行此操作时,向不同的服务发出请求,活动变得滞后,或者有时由于其中一个请求,应用程序完全崩溃,而不是返回单个请求的null。如果我不添加get at for循环,循环将继续,而不从服务获取数据。 对于如何改进这一点,有什么建议吗
{
"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);
}
}
`它很可能因为调用.get而延迟-如果您想这样做,则必须异步回调,这需要定义一个接口并将其实现的实例传递到AsyncTask的构造函数中,例如,在已知调用数后,为了显示进度条。更好地使用改装和映射模型类与GSON转换器。如果所有的响应看起来都一样,一个模型就足够了,否则每种响应都需要一个模型。给出了JSON示例,其大致如下所示:
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;
}
}
DataValue类也是如此。如果您希望执行多个请求,请使用servicebind或scheduler,如果您尝试使用异步执行此操作,则会破坏应用程序性能。是的,即使我向HttpHandler的UrlConnection添加超时,如果我收到的请求超过20个,我的等待时间几乎变为3-4秒。我已经获得了改造的第一个列表,但在创建接口时,我不知道以后将获得哪些服务或哪些服务链接。这就是为什么在通过改造获得第一个列表后,我必须通过使用HttpUrlConnection创建新连接来检查每一行并收集它们的数据,然后解析其JSONdata@Kuroiteiken您不需要任何服务,但需要异步运行它。接口定义只提供AsyncTask和实现该接口的调用方类之间的接口。请特别参阅回调部分。在第一次调用时,您将知道调用的数量,在接下来的调用中,您可以在进度条上使用i++进行回调,报告错误等。