是否可以使用Class作为AsyncTask参数?

时间:2018-02-08 17:05:15

标签: java android android-asynctask

我使用包含AsyncTask的类从我的服务器获取 JSON ,它返回根据情况而变化的不同类型的变量(有时会返回{{1有时候String等)。所以我想要实现的是使用相同的类,但根据情况更改Bool返回值。

如果我的脚本返回onPostExecute(),结果将更改为Bool等。我想知道是否可以将类作为参数传递给Java中的Boolean方法?或者,如果还有其他更好的选择?提前谢谢。

AsynTask

3 个答案:

答案 0 :(得分:1)

问题不明确。您已指定从服务器获取 JSON ,它应以JSON格式返回响应。

你的意思是什么回报类型有时会有所不同?

如果键的值在响应JSON中有所不同,那么您将响应String转换为JSON对象并检查适当的数据类型,如

Object obj = jsonObject.get("some_key");
if (obj.getClass().equals(Boolean.class) {
    // do your operation
}
// other checks goes here

答案 1 :(得分:1)

是的,你可以,但问题是听众,如果你有一个它应该是:

public class PHPConnecteur<T> extends AsyncTask<String, Integer, T>{
  Listener<T> executedListener;
  //set executedListener in constructor

  @Override
  protected void onPostExecute(final T result) {
       executedListener.on(result);
  }
}

所以你可以这样打电话:

 new PHPConnecteur<String>(new Listener<String>() {
       void on(String result) {
            //do with result
       }
   });

但是,asynctask的结果仍然必须在doInBackground中使用简单的return(T)结果转换为T,并且没有简单的方法将其转换为正确的类型而不是执行所有类型检查。

答案 2 :(得分:0)

我认为您最好的选择是将Object作为参数传递,然后在onPostExecute(Object对象)上使用以下示例查看您的对象是什么类:

                                                 0                                                1
A         {'page': 1, 'url': 'xxx', 'name': 'foo'}                                              NaN
B  {'page': 1, 'url': 'http://xxx', 'name': 'bar'}                                              NaN
C  {'page': 3, 'url': 'http://xxx', 'name': 'foo'}                                              NaN
D                                              NaN         {'page': 2, 'url': 'xxx', 'name': 'bar'}
E                                              NaN  {'page': 2, 'url': 'http://xxx', 'name': 'bar'}
F                                              NaN  {'page': 3, 'url': 'http://xxx', 'name': 'foo'}

并咨询每种类型。

 private static class PHPConnecteur extends AsyncTask<String, Integer, Object> {

    @Override
    protected Object doInBackground(String... params) {
        Boolean aBoolean = false;
        return aBoolean;
    }

    @Override
    protected void onPostExecute(Object object) {

        if (object.getClass().equals(Boolean.class)) {
            //do something
        } else if (object.getClass().equals(Integer.class)) {
            //do something
        } else if (object.getClass().equals(String.class)) {
            //do something
        } //etc