0

EditText フィールドからエントリを受け取った後、MainActivity クラスでインテントを開始しようとしています。いくつかのデータを追加で渡します。MainActivity で、インテントからのエクストラがあるかどうかを確認します。その場合、非同期タスクでデータを処理します。問題は、私の MainActivity が Intent からのエクストラをチェックするプロセスを 2 回実行し、最終的にプログラムが爆撃することです。非常にややこしいので、プログラムの流れを以下に示します。最初の以下は、MainActivity の下の別のアクティビティでのインテントの開始です。

   thisLocation = (EditText) findViewById(R.id.restlocation);

        thisLocation.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if((keyCode == KeyEvent.KEYCODE_DPAD_CENTER)  ||
                        (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    String location = thisLocation.getText().toString();
                    Log.d("Location in key listener", location);
                    try
                    {
                    List<Address> foundGeocode = null;

                    foundGeocode = new Geocoder(getApplicationContext()).getFromLocationName(location, 1);
                    double  newlat = foundGeocode.get(0).getLatitude(); //getting latitude
                    double  newlng = foundGeocode.get(0).getLongitude();//getting longitude
                    Log.d("Lat in key listener", String.valueOf(newlat));
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.putExtra("lat", String.valueOf(lat));
                    intent.putExtra("lng", String.valueOf(lng));
                    startActivity(intent);

                    }

                    catch (IOException e) {
                        Log.e("Geocode", String.valueOf(e));
                    }

    return true;
    }
    return false;
   }
 });

私のログから、MainActivity に進む前に、処理が上記のルーチンを 2 回行っていることがわかります。リスナーを初めて通過した後、logcat はタグ「MapActivity」と、上記のアクティビティである「onDestroy leave light on com.example.herbx.Restaurant」のテキストを表示します。次回は MainActivity を入力します。これは、logcat に次のメッセージが表示されるたびに、以下のロジックを 2 回通過します。Tag = MapActivity Text=Recycling map object.

次は、上記のアクティビティから受け取った Intent からのエクストラの MainActivity 処理です。

    protected void onCreate(Bubdke savedInstanceState) {
       ......  intialization code

        Bundle extras = getIntent().getExtras();
    if(extras != null)
    {

        lat = Float.parseFloat(extras.getString("lat"));
        lng = Float.parseFloat(extras.getString("lng"));
        Log.d("lat=", String.valueOf(lat));
        NewMap(lat, lng);  // This is an asynchronous task
    }
       }

以下は、特定のデータを記録した場所を示す logcat のダンプです。

    03-20 19:21:30.256: D/Location in key listener(4045): Peoria
    03-20 19:21:30.519: D/Lat in key listener(4045): 40.6936488
    03-20 19:21:30.616: D/MapActivity(4045): onDestroy leaving the lights on for com.example.herb4.Restaurant@40fc2f88
    03-20 19:21:30.736: D/Location in key listener(4045): Peoria
    03-20 19:21:30.986: D/Lat in key listener(4045): 40.6936488
    03-20 19:21:31.016: I/Choreographer(4045): Skipped 45 frames!  The application may be doing too much work on its main thread.
    03-20 19:21:31.168: W/MapActivity(4045): Recycling dispatcher android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher@40cf8f38
    03-20 19:21:31.207: V/MapActivity(4045): Recycling map object.
    03-20 19:21:31.426: D/lat=(4045): 40.9040412902832
    03-20 19:21:31.746: D/newmap addr=(4045): W 7th StMinonk, IL 61760
    03-20 19:21:31.896: W/MapActivity(4045): Recycling dispatcher android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher@40cf8f38
    03-20 19:21:31.948: V/MapActivity(4045): Recycling map object.
    03-20 19:21:32.166: D/lat=(4045): 40.9040412902832
    03-20 19:21:32.206: D/GetRestaurant lat=(4045): 40.9040412902832
    03-20 19:21:32.387: D/newmap addr=(4045): W 7th StMinonk, IL 61760
    03-20 19:21:32.446: I/Choreographer(4045): Skipped 69 frames!  The application may be doing too much work on its main thread.
    03-20 19:21:32.726: D/dalvikvm(4045): GREF has increased to 201
    03-20 19:21:32.956: D/InputEventConsistencyVerifier(4045): KeyEvent: ACTION_UP but key was not down.
    03-20 19:21:32.956: D/InputEventConsistencyVerifier(4045):   in android.view.ViewRootImpl@4109f880
    03-20 19:21:32.956: D/InputEventConsistencyVerifier(4045):   0: sent at 15675516000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_ENTER, scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=15675516, downTime=15675423, deviceId=0, source=0x101 }
    03-20 19:21:33.166: E/InputEventReceiver(4045): Exception dispatching input event.
    03-20 19:21:33.166: E/MessageQueue-JNI(4045): Exception in MessageQueue callback: handleReceiveCallback
    03-20 19:21:33.256: E/MessageQueue-JNI(4045): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
   03-20 19:21:33.256: E/MessageQueue-JNI(4045):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
   03-20 19:21:33.256: E/MessageQueue-JNI(4045):    at java.util.ArrayList.get(ArrayList.java:304)

私の質問は、上記の最初のアクティビティでデータを入力するときに、プログラムがロジックを 2 回通過するのはなぜですか? 非常に紛らわしく、最終的な結果として、MessageQueue callbackL handleReceiveCallback と IndexOutOfBoundsException で例外を示すエラーが発生します。
この紛らわしい問題についてさらに詳しい情報が必要な場合は、お知らせください。

以下は、nullexception を取得したように見えるコードですが、"GetRestaurant lat=" の最初のログを取得していますが、"GetRestaurant try" である 2 番目のログを取得していません。これら 2 つのログの間で nullexception が発生する可能性がある場所がわかりません。また、私は他の情報源からこのルーチンに入り、それは機能しますが、このコンテキストでは機能しません.

 List<String> result = new ArrayList<String>();
URL url;
Log.d("GetRestaurant lat=", thislat);  // this gets logged
try {
 Log.d("GetRestaurant try", "");   //  this doesn't get logged
String query = "?lat=" + thislat + "&lng=" + thislng + "&uid=&vegkey=1";
url = new URL("http://10.0.2.2:8000/herbivorenew/webservice/frontpage1.php" + query);
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
int responseCode = httpConnection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK) {
    InputStream in = httpConnection.getInputStream();
    BufferedReader br = new BufferedReader(
        new InputStreamReader(in));
String line;

int x=0;
while ((line = br.readLine()) != null) {
    result = new ArrayList<String>(Arrays.asList(line.split("&")));
     Log.d("GetRestaurant result=", String.valueOf(result.get(0)));
    x++;
}  
4

1 に答える 1

1

onKey() は、キーが押されたときに 1 回、キーが離されたときに 1 回、合計 2 回呼び出されます。あなたがする必要があるのは次のようなものです:

public boolean onKey(View v, int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER ||
            keyCode == KeyEvent.KEYCODE_ENTER) {
            if (event.getAction()!=KeyEvent.ACTION_DOWN) {
                return true;
            }

            // here goes your code

            return true;
        }

        return false;
    }
于 2013-03-20T20:35:16.637 に答える