0

以前はintまたは文字列を追加するだけで標準形式のList配列を使用していましたが、現在はListメソッドを使用してコレクションを調べています。

Imが現在調べているコードは、次のクラスを実装しています。

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」メソッドから実行される地名のリスト(このコードの場合)を返していることを理解しています。渡された文字列は、ユーザーが入力した郵便番号です。3つのドットが文字列とともに渡される理由を誰かに教えてもらえますか?私はそれが単に「文字列arg0」ではなく「文字列...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

ええ、AsyncTaskで行っていることは正しいように見えます。

UIスレッドのみがUIを変更する必要があり、doInBackgroundメソッドはUIスレッドで実行されません。onPostExecuteはです。

まあ、スタックトレースは自明です、JSONはあなたが「E4」であると解析しようとしています。解析可能な数値のみを提供する必要があるようです:)

于 2013-02-21T21:12:16.943 に答える
0

渡された文字列は、ユーザーが入力した郵便番号です。3つのドットが文字列とともに渡される理由を誰かに教えてもらえますか?私はそれが単に「文字列arg0」ではなく「文字列...arg0」であると思いましたか?

これらは可変アリティ引数と呼ばれ、AsyncTaskが引数に関してより柔軟になるように提供されています。viaarg0[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 に答える
0
  1. 3つのドット(...)は、。とも呼ばれる可変引数に使用されますvarargs。詳細はこちらJava、パラメータに3つのドット

  2. onPostExecute()実行が終了した後に呼び出されdoInBackground()ます。

  3. で任意のメソッドを呼び出すことができますが、 GUIに触れないdoInBackground()ように注意してください。

  4. どこかでE4searchPostalCode()を数値として解析しようとしているため、例外が発生しています。

于 2013-02-21T21:17:30.413 に答える