Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android上创建对webservice的多个请求_Android_Rest_Asynchronous - Fatal编程技术网

在android上创建对webservice的多个请求

在android上创建对webservice的多个请求,android,rest,asynchronous,Android,Rest,Asynchronous,我有一个RestService,它提供了另一个服务链接的列表 而我需要处理每个serviceUrl并获取其包含类型和值的对象。我的最终列表将是图像、对象名称、值和类型。 为此,在获取restobject之后,我将遍历每个对象,然后使用AsyncTask执行get方法。但在执行此操作时,向不同的服务发出请求,活动变得滞后,或者有时由于其中一个请求,应用程序完全崩溃,而不是返回单个请求的null。如果我不添加get at for循环,循环将继续,而不从服务获取数据。 对于如何改进这一点,有什么建议吗

我有一个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++进行回调,报告错误等。