我的LIST <e> AsyncTask理解是否正确?</e>

时间:2013-02-21 21:07:46

标签: java android list android-asynctask

我之前使用标准形式的List数组只需添加int或字符串,但我现在正在使用List方法查找集合。

我正在查看的代码实现了以下类:

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类的重写方法变得有点迷失时。

我理解代码返回的是一个List(在这个代码的情况下),是从GeoNameService类的'searchPostalCode'方法运行的地名。传递的字符串是用户输入的邮政编码。有人能告诉我为什么这三个点与字符串一起传递?我认为它只是'string arg0'而不是'string ... arg0'?

一旦doInBackGround方法返回,我是否认为'onPostExecute'方法总是在此之后直接调用?

我也读过用'doInBackGround'方法调用方法是不好的做法。

在我运行此代码的那一刻,并尝试输入字母和数字的组合,即'E4',我在doInBackGround方法中收到错误,但整数如'24501'都没问题,如图所示。< / p>

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)

3 个答案:

答案 0 :(得分:0)

是的,你在使用AsyncTask做的事情看起来是正确的。

只有UI线程才能修改UI,而doInBackground方法不会在UI线程中运行。 onPostExecute是。

好吧,堆栈跟踪是不言自明的,JSON试图解析你的“E4”作为一个数字未能这样做。看起来你应该只提供可解析的数字:)

答案 1 :(得分:0)

  

传递的字符串是用户输入的邮政编码。有人能告诉我   为什么这三个点用字符串传递?我会想到的   简直就是'string arg0'而不是'string ... arg0'?

它们被称为variable arity arguments并且被提供以便AsyncTask在参数方面可以更灵活。只要有一个或多个参数,访问arg0[0]是访问提供的参数的正确方法。

但如果你有多个,你可以循环使用它们:

例如:

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

一旦doInBackGround方法返回,我是否正确思考   'onPostExecute'方法总是在此之后直接调用?

是的,请参阅documentation

  

onPostExecute(Result),在后台后的UI线程上调用   计算结束。背景计算的结果是   作为参数传递给此步骤。


  

另外我已经读过用a调用方法是不好的做法   '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()

答案 2 :(得分:0)

  1. 3个点(...)用于变量参数,也称为varargs。更多信息Java, 3 dots in parameters

  2. onPostExecute()doInBackground()完成执行后调用。

  3. 您可以在doInBackground()中调用任何方法,只需小心即可触摸GUI。

  4. searchPostalCode()中的某个地方,您试图将 E4 解析为一个数字,这就是您获得例外的原因。