在Android上创建对Web服务的多个请求

时间:2019-11-25 12:57:06

标签: android rest asynchronous

我有一个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);
    }
}

`

1 个答案:

答案 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; } } 也是如此。