0

我以前通过简单地添加 int 或字符串以标准形式使用 List 数组,但我现在正在使用 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 类的重写方法时,我有点迷失了。

我了解该代码正在返回从 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)
4

3 回答 3

0
  1. 3 个点 ( ...) 用于变量参数,也称为varargs. 更多这里Java,参数中的 3 个点

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

  3. 你可以调用任何方法doInBackground(),只是注意不要触摸GUI。

  4. searchPostalCode()你的某个地方试图将E4解析为一个数字,这就是你得到异常的原因。

于 2013-02-21T21:17:30.413 回答
0

是的,您对 AsyncTask 所做的事情看起来是正确的。

只有 UI 线程应该修改 UI,并且 doInBackground 方法不在 UI 线程中运行。onPostExecute 是。

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

于 2013-02-21T21:12:16.943 回答
0

传递的字符串是用户输入的邮政编码。有人能告诉我为什么三个点是用字符串传递的吗?我会认为它只是'string arg0'而不是'string ... arg0'?

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

但如果你有不止一个,你可以遍历它们:

例如:

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

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

是的,请参阅文档

onPostExecute(Result),在后台计算完成后在 UI 线程上调用。后台计算的结果作为参数传递给该步骤。


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

如果该方法修改了UI 线程,是的,那就不好了。

在我运行此代码并尝试输入字母和数字的组合(即“E4”)时,我在 doInBackGround 方法中遇到错误,但整数(例如“24501”)很好,如图所示。

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

基于堆栈跟踪,使用不适用于字母JsonReader.nextInt()的底层方法。Double.parseDouble()

于 2013-02-21T21:13:35.253 回答