2013-02-21 47 views
0

我之前通過簡單地添加int或字符串在標準表單中使用List數組,但我現在正在使用List方法查看集合。是我的LIST <E> AsyncTask理解正確嗎?

林目前正在研究中的代碼實現了以下類:

public class GeoNamesAsyncTask extends AsyncTask<String, Void, List<GeoName>> { 

private Context ctx = null; 

public GeoNamesAsyncTask(Context ctx) { 
    this.ctx = ctx; 
} 

@Override 
protected List<GeoName> doInBackground(String... arg0) { 
    return new GeoNamesService().searchPostalCode(arg0[0]); 
} 

@Override 
protected void onPostExecute(List<GeoName> result) { 
    this.populateActivity(result); 
} 

類這種方法是在擴展的AsyncTask超類,並且配備了標準的構造函數設置從調用它的類的上下文。直到現在我明白了。

現在,當'doInBackGround'方法的AsyncTask類的重寫方法變得有點失落時。

據我所知,該代碼正在返回從GeoNameService類的'searchPostalCode'方法運行的(在此代碼的情況下)地名。傳遞的字符串是用戶輸入的郵政編碼。有人能告訴我爲什麼這三個點與字符串一起傳遞?我會認爲它只是'string arg0'而不是'string ... arg0'?

一旦doInBackGround方法返回,我是否認爲'onPostExecute'方法總是直接調用後?

另外我讀過這是不好的做法,用'doInBackGround'方法調用方法。

當我運行這段代碼並嘗試輸入字母和數字的組合(即'E4')時,doInBackGround方法中出現錯誤,但'24501'等整數很好,如圖所示。

02-21 20:05:18.461: E/AndroidRuntime(352): FATAL EXCEPTION: AsyncTask #1 
02-21 20:05:18.461: E/AndroidRuntime(352): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-21 20:05:18.461: E/AndroidRuntime(352): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.lang.Thread.run(Thread.java:1096) 
02-21 20:05:18.461: E/AndroidRuntime(352): Caused by: com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: E4 6AA 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:232) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:222) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.Gson.fromJson(Gson.java:795) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.Gson.fromJson(Gson.java:761) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.Gson.fromJson(Gson.java:710) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.Gson.fromJson(Gson.java:682) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.example.restfulweb.GeoNamesService$DataWrapper.fromJson(GeoNamesService.java:85) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.example.restfulweb.GeoNamesService.searchPostalCode(GeoNamesService.java:41) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.example.restfulweb.GeoNamesAsyncTask.doInBackground(GeoNamesAsyncTask.java:21) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.example.restfulweb.GeoNamesAsyncTask.doInBackground(GeoNamesAsyncTask.java:1) 
02-21 20:05:18.461: E/AndroidRuntime(352): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-21 20:05:18.461: E/AndroidRuntime(352): ... 4 more 
02-21 20:05:18.461: E/AndroidRuntime(352): Caused by: java.lang.NumberFormatException: E4 6AA 
02-21 20:05:18.461: E/AndroidRuntime(352): at org.apache.harmony.luni.util.FloatingPointParser.initialParse(FloatingPointParser.java:130) 
02-21 20:05:18.461: E/AndroidRuntime(352): at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:281) 
02-21 20:05:18.461: E/AndroidRuntime(352): at java.lang.Double.parseDouble(Double.java:287) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.stream.JsonReader.nextInt(JsonReader.java:599) 
02-21 20:05:18.461: E/AndroidRuntime(352): at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:230) 
+0

你可以發佈你的代碼爲GeoName對象嗎?此行指向GSON錯誤,可能與您的註釋或您試圖映射數據的方式有關:02-21 20:05:18.461:E/AndroidRuntime(352):引起來源:com.google.gson.JsonSyntaxException :java.lang.NumberFormatException:E4 6AA – 2013-02-21 21:11:33

+0

另外,是的,你不直接調用'doInBackground()'。你想調用'execute()'方法來處理AsyncTask的所有其他必要的調用。 – 2013-02-21 21:12:55

回答

0

傳入的參數是用戶輸入的郵政編碼。有人能告訴我 爲什麼這三個點與字符串一起傳遞?我會認爲它 會簡單地'串arg0'而不是'串... arg0'?

他們被稱爲variable arity arguments並提供使的AsyncTask可以在參數方面更靈活。只要有一個或多個參數,通過arg0[0]進行訪問是訪問提供的參數的正確方法。

但是,如果你有一個以上的,你可以通過他們的循環:

如:

for (String s: arg0) 
{ 
    System.out.println (s); 
} 

一旦doInBackground方法又回來了,我是正確的思維 的「onPostExecute」方法總是在這之後直接調用?

是的,看到documentation

onPostExecute(結果),背景 計算完成後的UI線程調用。後臺計算的結果是 作爲參數傳遞給此步驟。


而且我看過它是不好的做法,呼籲有 'doInBackGround' 方法的方法。

如果該方法修改了UI Thread是的,那很糟糕。

在當我運行這段代碼,並試圖進入 字母和數字組合的時刻,即「E4」我收到 doInBackGround方法,但整數中的錯誤,如「24501」是罰款,如 所示。

02-21 20:05:18.461: E/AndroidRuntime(352): Caused by: java.lang.NumberFormatException: E4 6AA 

基於堆棧跟蹤,JsonReader.nextInt()使用底層方法Double.parseDouble()不與字母工作。

+1

非常感謝,清除了這一點。我可以看到[0]看起來是某種類型的第一個數組對象,並且僅僅傳遞了一個非常有意義的變量。解析異常是一個將字段設置爲int的簡單情況,它應該是String。 – user1352057 2013-02-21 21:24:49

0

是的,你在做什麼與AsyncTask看起來是正確的。

只有UI線程應修改UI,並且doInBackground方法不在UI線程中運行。 onPostExecute是。

那麼,堆棧跟蹤是不言自明的,JSON試圖解析你是「E4」作爲一個數字沒有這樣做。看起來你應該只提供可分析的數字:)

0
  1. 3點(...)用於可變參數也稱爲varargs。更多這裏Java, 3 dots in parameters

  2. doInBackground()完成執行後調用。

  3. 您可以撥打doInBackground()中的任何方法,只需要小心而不是來觸摸GUI。

  4. 某處searchPostalCode()你正在試圖解析E4爲一個數字,這就是爲什麼你越來越例外。