2011-04-20 24 views
2

對於Android項目,我有許多我希望運行異步的響應任務。這些任務只因他們生產的班級類型而有所不同。我對Java泛型很陌生,所以我很難用一個通用的T或ClassT替換News.class(仍然計算出這些差異),是否有人可以指出我可以如何正確地考慮這一點?Android上的Java泛型AsyncTask

return (T) DataToObject.acquireResponse(rc[0], 
       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); 
    } 
} 

回答

4

所以這裏的,似乎工作的過程。對於任何請求,我的響應將是JSON數據,我希望GSON將數據檢索並解析爲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()); 
0

你怎麼從返回?

如果是的話:

你需要使用泛型工作時要記得
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); 
} 

} 
+0

我試圖除去特定類新聞參考並將其替換爲一個通用的。 – jchristof 2011-04-20 20:22:34

+0

你爲什麼想這樣做?解釋原因,這樣我可以更有幫助。 – neteinstein 2011-04-21 09:35:24

+0

看到我的回答上面 – jchristof 2011-04-21 16:12:43

1

一件事,就是類型信息只存在在編譯時,不是運行。如果你需要使用類型來執行運行時的東西(比如你的類型轉換爲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)); 
} 
+0

這真的很接近我想出的。 – jchristof 2011-04-21 15:54:34