2013-03-08 5 views
0

Я пытаюсь запустить асинхронную задачу после получения gps-координат из моей карточной программы в Android MainActivity. Асинхронная задача состоит в том, чтобы выполнить httpurlconnection для получения данных с моего сервера на основе координат gps. Однако асинхронная задача GetRestaurant() никогда не вызывается при наблюдении в моем процессе отладки. Я должен упомянуть, что в отладчике процедура петлителя вызывается снова и снова. В отладке я заметил, что программа выполняет инструкцию GetRestaurant, но после этого ничего не происходит. Класс никогда не достигается. Карта действительно отображается, и об этом. Может ли кто-нибудь сказать из приведенного ниже кода, почему мой асинхронный класс задач GetRestaurant никогда не выполняется?Процедура AsyncTask не называется

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(); 

    } 



    } 

Вот мой ErrorLog: Я заметил эту ошибку: «Невозможно создать обработчик внутри потока, который не под названием 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. Я изменил код, чтобы прочитать «return (String []) result.toArray() в конце doInBackground. Теперь я получаю следующую ошибку: '03 -09 03: 24: 18.796: E/AndroidRuntime (4726): вызвано: java.lang.ClassCastException: java.lang.Object [] не может быть добавлено в 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(); 

    } 

Это было бы намного проще, если бы я мог следовать программе в отладчике, но она завершает работу, прежде чем я к проблемной области.

+0

В отладчике вы должны искать различные темы, скорее всего. Вы настраивали некоторые записи для проверки фоновой задачи? Запускаете ли вы задачу определения местоположения в потоке пользовательского интерфейса? –

+0

Что значит «петлевая рутина называется снова и снова»? Я предполагаю, что ваш LocationListener не настроен должным образом (и, таким образом, не получает обновления местоположения), но эта часть вопроса заставляет меня думать, может быть, есть другая проблема. – DigCamara

+0

попытайтесь использовать 'Log.e' в вашей' doInBackground', чтобы проверить, вызвана ли doInBackground или нет? – Shoshi

ответ

0

Посмотрите на this answer Это объясняет ошибку, которая появляется в вашем LogCat Если вы хотите, чтобы иметь четкое представление о вашей ошибке, избавиться от Toast,.. ваш 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()); 
+0

Я попробовал ваше предложение по запуску его в пользовательском интерфейсе, и я до сих пор не добираюсь до метода doInBackground. – Dave

+0

Я бегу по этому API verison: android: targetSdkVersion = "17" /> – Dave

+0

Я не могу избавиться от цикла try/catch, поскольку он дает мне всевозможные ошибки, если я это делаю. – Dave

Смежные вопросы