0

Android MainActivity のマップ ルーチンから GPS 座標を取得した後、非同期タスクを実行しようとしています。非同期タスクは、httpurlconnection を実行して、GPS 座標に基づいてサーバーからデータを取得することです。ただし、非同期タスク GetRestaurant() は、デバッグ プロセスで監視中に呼び出されることはありません。デバッガーでルーパールーチンが何度も呼び出されている間、言及する必要があります。デバッグ中に、プログラムが GetRestaurant 命令を実行することに気付きましたが、その後は何も起こりません。クラスに到達することはありません。マップは表示されますが、それだけです。以下のコードから、私の非同期タスク クラス GetRestaurant が実行されない理由がわかるでしょうか?

locationManager.requestLocationUpdates(provider, 3600, 1000, new LocationListener() {

        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}


        public void onLocationChanged(Location loc) {
            if(loc != null) {
                lat = (float) (loc.getLatitude());
                lng = (float) (loc.getLongitude());

                String latLongString = "Lat:" + lat + "\nLong:" + lng;
                myLocationText.setText("Your current position is:\n" + latLongString);
                int latit = (int) (loc.getLatitude() * 1E6);
                int longit = (int) (loc.getLongitude() * 1E6);
                point = new GeoPoint(latit, longit);
                mapController.animateTo(point);
                mapController.setCenter(point);
                mapController.setZoom(15);
                String addr=getAddress(point);
                TextView addressView = (TextView) findViewById(R.id.address_view);
                addressView.setText(addr);
                MyOverlay mapOverlay = new MyOverlay();
                List<Overlay> overlayList=mapView.getOverlays();
                overlayList.clear();
                overlayList.add(mapOverlay);

                new GetRestaurant().execute();

            }

        }
    });

}

 class GetRestaurant extends AsyncTask<Void, Void, String[]> {
 @Override
    protected String[] doInBackground(Void...parameters ) {
        // TODO Auto-generated method stub

        String thislat = ((String.valueOf(lat)));
        String thislng = ((String.valueOf(lng)));
        String[] result = null;
        URL url;


         try {

            String query = "lat=" + thislat + "&lng=" + thislng + "&uid=&vegkey=1";
            url = new URL("http://10.0.2.2:8000/xxxxxxx/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));

                StringBuilder sb = new StringBuilder();

                String line;
                int x=0;
                while ((line = br.readLine()) != null) {
                  //     sb.(line);
                    result[x] = line;
                    x++;
                } 

            }


        }

        catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
            System.out.println(e.toString());
        }


    return result;
    }

    protected void onProgressUpdate(Integer... progress) {

    }
    @Override
    protected void onPostExecute(String[] result) {

        restaurants = result;
        final ArrayAdapter<String> arrayAdpt = new ArrayAdapter<String>(null, android.R.layout.simple_list_item_1, restaurants);
        restaurant_list.setAdapter(arrayAdpt);
        mapView.postInvalidate();

    }



  }

これが私のエラーログです: 「Looper.prepare() を呼び出していないスレッド内でハンドラーを作成できません」というエラーに気付きました。それは疑わしいですね。

 03-08 23:53:27.846: E/AndroidRuntime(570): FATAL EXCEPTION: AsyncTask #1
 03-08 23:53:27.846: E/AndroidRuntime(570): java.lang.RuntimeException: An error occured while executing doInBackground()
 03-08 23:53:27.846: E/AndroidRuntime(570):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
 03-08 23:53:27.846: E/AndroidRuntime(570):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
 03-08 23:53:27.846: E/AndroidRuntime(570):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at java.lang.Thread.run(Thread.java:856)
  03-08 23:53:27.846: E/AndroidRuntime(570): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  03-08 23:53:27.846: E/AndroidRuntime(570):    at android.os.Handler.<init>(Handler.java:197)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at android.os.Handler.<init>(Handler.java:111)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at android.widget.Toast$TN.<init>(Toast.java:324)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at android.widget.Toast.<init>(Toast.java:91)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at android.widget.Toast.makeText(Toast.java:238)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at com.example.herb4.MainActivity$GetRestaurant.doInBackground(MainActivity.java:159)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at com.example.herb4.MainActivity$GetRestaurant.doInBackground(MainActivity.java:1)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
  03-08 23:53:27.846: E/AndroidRuntime(570):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
  03-08 23:53:27.846: E/AndroidRuntime(570):    ... 4 more

Ok。doInBackground の最後に 'return (String[]) result.toArray() を読むようにコードを変更しました。今、次のエラーが表示されます: '03-09 03:24:18.796: E/AndroidRuntime(4726): 原因: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[ ]'。以下のコードの onPostExecute でエラーが発生したと思います」

  @Override
    protected void onPostExecute(String[] result) {

    //  restaurants = result;
        final ArrayAdapter<String> arrayAdpt = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, result);
        restaurant_list.setAdapter(arrayAdpt);
        mapView.postInvalidate();

    }

デバッガーでプログラムを追跡できれば、これははるかに簡単になりますが、問題の領域に到達する前に終了します。

4

1 に答える 1

0

この答えを見てください。logcatに表示されているエラーについて説明します。エラーの明確なビジョンが必要な場合は、トーストを取り除きます。System.outの出力がlogcatに表示されます。


問題:doInBackgroundには

 String[] result = null;

初期化せずにループで使用しているもの。私はあなたの実際のエラーはあなたのヌル変数例外だと思います

result[x]=line;

ライン。

ソリューションの拡張。これを変更する必要がある場所を見つけられることを願っています。

 String line;
 List<String> result = new ArrayList<String>();
 int x=0;
 while ((line = br.readLine()) != null) {
 //     sb.(line);
     result.add(line);

 } 
 return (String[])(result.toArray());
于 2013-03-08T23:20:05.257 に答える