繁体   English   中英

Android AsyncTask上的Java泛型

[英]Java generics on an Android AsyncTask

对于一个Android项目,我有许多要异步运行的响应任务。 这些任务仅因它们产生的类的类型而异。 我是Java泛型的新手,所以我很难用通用T或ClassT替换News.class(仍在找出差异),有人可以指出我如何正确地考虑这一点?

private class AcquireResponseTask<T> extends AsyncTask<RestClient, Void, T> 
{
     protected void onPostExecute(T news) 
     {
         process(news);
     }

    @Override
    protected T doInBackground(RestClient... rc)
    {

        return (T) DataToObject.acquireResponse(rc[0],
                News.class);
    }
 }

所以这似乎是可行的过程。 对于任何请求,我都有响应,其中响应将是JSON数据,我希望该数据被GSON检索并解析为Java类对象-使用该类创建一个类型为“以Java类表示的JSON数据”的新AcquireResponseTask类型和处理功能对象以处理具体细节。

public interface ProcessResponse<T>
{
    void process(T response);
}

public class AcquireResponseTask<T> extends AsyncTask<RestClient, Void, T> 
{
    private Class<T> type;
    private ProcessResponse<T> func;

    public AcquireResponseTask(Class<T> classType, ProcessResponse<T> f)
    {
        type = classType;
        func = f;
    }

     protected void onPostExecute(T response) 
     {
         func.process(response);
     }

    @Override
    protected T doInBackground(RestClient... rc)
    {
        return (T) JSONToJava.acquireResponse(rc[0],
                type);
    }
 }  

现在,我不再为每种数据类型多次编写以上代码,而是为每种数据提供以下代码:

class TopicsResponseProcessor implements ProcessResponse<Topics>
    {
        public void process(Topics response)
        {
            createTopicsList(response);
        }

    }

new AcquireResponseTask<Topics>(Topics.class,TopicsResponseProcessor ()).execute(UrlBuilder.getTopics());

使用泛型时,您需要记住的一件事是,类型信息仅在编译时出现,而不在运行时出现。 如果您需要对类型进行运行时处理(例如,将其强制转换为T),则需要显式地为该类型提供Class对象。

因此,您可以在构造函数中传递类,然后在以后使用它进行转换:

private final Class<T> theTClass;

public AcquireResponseTask( Class<T> clazz ) {
    theTClass = clazz;
}

@Override
protected T doInBackground(RestClient... rc)
{

    return theTClass.cast( DataToObject.acquireResponse(rc[0],
            News.class));
}

您从中得到什么:

return (T) DataToObject.acquireResponse(rc[0],
                News.class);

是新闻对象吗?

如果是,则:

private class AcquireResponseTask extends AsyncTask<RestClient, Void, News> 
{

@Override
protected News doInBackground(RestClient... rc)
{

    return (News) DataToObject.acquireResponse(rc[0],
            News.class);
}

@Override
protected void onPostExecute(News news) 
 {
     process(news);
 }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM