2014-02-01 4 views
0

Я пытаюсь получить координаты и адрес текущего местоположения пользователя, используя обратное геокодирование. Поскольку этот процесс занимает некоторое время, я хочу показать индикатор выполнения за это время, поэтому я использую AsyncTask. Итак, что в основном я делаю, из события onClick одного из событий я запускаю AsyncTask, который находит информацию о местоположении, а затем из этой AsyncTask запускаю другое действие, которое использует эту информацию.Использование AsyncTask для получения информации о местоположении

Это моя первая активность, где OnClick событие начинается AsyncTask:

public void onClickGirl(View view) 
{ 
    (new MyAsyncTask(MainActivity.this)).execute(); 
} 

Это AsyncTask:

public class MyAsyncTask extends AsyncTask<Void, Void, Void> implements LocationListener { 
    private Context ContextAsync; 
    public MyAsyncTask (Context context){ 
    this.ContextAsync = context.getApplicationContext(); 
    } 

    Dialog progress; 
    private String providerAsync; 
    private LocationManager locationManagerAsync; 
    double latAsync=0.0; 
    double lonAsync=0.0; 
    String thikanaAsync="Scan sms for location"; 

    String AddressAsync=""; 
    Geocoder GeocoderAsync; 

    @Override 
    protected void onPreExecute() { 
    super.onPreExecute(); 
    progress = ProgressDialog.show(null, "Loading data", "Please wait..."); 

    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
    // TODO Auto-generated method stub 
    locationManagerAsync = (LocationManager) ContextAsync.getSystemService(ContextAsync.LOCATION_SERVICE); 

    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
    criteria.setCostAllowed(false); 
    criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); 
    providerAsync = locationManagerAsync.getBestProvider(criteria, false); 

    if (locationManagerAsync.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     providerAsync = LocationManager.GPS_PROVIDER; 
    } else if (locationManagerAsync.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
     providerAsync = LocationManager.NETWORK_PROVIDER; 
     /*AlertDialog.Builder alert = new AlertDialog.Builder(this); 
     alert.setTitle("GPS is disabled in the settings!"); 
     alert.setMessage("It is recomended that you turn on your device's GPS and restart the app so the app can determine your location more accurately!"); 
     alert.setPositiveButton("OK", null); 
     alert.show();*/  
    } else if (locationManagerAsync.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) { 
     providerAsync = LocationManager.PASSIVE_PROVIDER; 
     Toast.makeText(ContextAsync, "Switch On Data Connection!!!!", Toast.LENGTH_LONG).show(); 
    }  

    Location location = locationManagerAsync.getLastKnownLocation(providerAsync); 
    // Initialize the location fields 
    if (location != null) { 
     // System.out.println("Provider " + provider + " has been selected."); 
     latAsync = location.getLatitude(); 
     lonAsync = location.getLongitude(); 
     onLocationChanged(location); 
    } else { 
     Toast.makeText(ContextAsync, " Locationnot available", Toast.LENGTH_SHORT).show(); 
    } 

    List<Address> addresses = null; 
    GeocoderAsync = new Geocoder(ContextAsync, Locale.getDefault()); 
    try { 
     addresses = GeocoderAsync.getFromLocation(latAsync, lonAsync, 1); 

     String address = addresses.get(0).getAddressLine(0); 
     String city = addresses.get(0).getAddressLine(1); 
     String country = addresses.get(0).getCountryName(); 
     AddressAsync = Html.fromHtml(
       address + ", " + city + ",<br>" + country).toString(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     AddressAsync = "Refresh for the address"; 
    } 

    return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

    super.onPostExecute(result); 
    progress.dismiss(); 
    Intent intentAsync = new Intent(ContextAsync,Emerg.class); 
    intentAsync.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intentAsync.putExtra("calculated_Lat", latAsync); 
    intentAsync.putExtra("calculated_Lon", lonAsync); 
    intentAsync.putExtra("calculated_address", AddressAsync); 
    ContextAsync.startActivity(intentAsync); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
     locationManagerAsync.requestLocationUpdates(providerAsync, 0, 0, this); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

    } 

} 

Это вторая активность, которая запускается после AsyncTask: `

Intent ixx = getIntent(); 
elat = Double.parseDouble(ixx.getStringExtra("calculated_Lat")); 
elon = Double.parseDouble(ixx.getStringExtra("calculated_Lon")); 
eAddress1 = ixx.getStringExtra("calculated_address"); 

И это LogCat:

 
02-01 17:15:26.734: E/AndroidRuntime(2587): java.lang.IllegalStateException: Could not execute method of the activity 

02-01 17:15:26.734: E/AndroidRuntime(2587):  at android.view.View$1.onClick(View.java:3814) 

02-01 17:15:26.734: E/AndroidRuntime(2587):  at android.view.View.performClick(View.java:4424) 

02-01 17:15:26.734: E/AndroidRuntime(2587):  at android.os.Handler.handleCallback(Handler.java:733) 

02-01 17:15:26.734: E/AndroidRuntime(2587):  at android.os.Handler.dispatchMessage(Handler.java:95) 

02-01 17:15:26.734: E/AndroidRuntime(2587):  at android.os.Looper.loop(Looper.java:137) 

Я провел несколько часов после этого, но не могу найти проблему. Может ли кто-нибудь помочь мне узнать, что мне не хватает?

ответ

3

Вы можете найти обновленный код и проверить его на вашем конце и дайте мне знать, если у вас есть какие-либо запрос:

package com.example.tabhost; 

import java.util.List; 
import java.util.Locale; 

import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Address; 
import android.location.Criteria; 
import android.location.Geocoder; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Html; 
import android.util.Log; 

public class MyAsyncTask extends AsyncTask<Void, Void, Void> implements LocationListener { 
    private Context ContextAsync; 
    public MyAsyncTask (Context context){ 
     this.ContextAsync = context; 
    } 

    Dialog progress; 
    private String providerAsync; 
    private LocationManager locationManagerAsync; 
    double latAsync=0.0; 
    double lonAsync=0.0; 
    String thikanaAsync="Scan sms for location"; 

    String AddressAsync=""; 
    Geocoder GeocoderAsync; 

    Location location; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progress = ProgressDialog.show(ContextAsync, "Loading data", "Please wait..."); 

    } 


    @Override 
    protected Void doInBackground(Void... arg0) { 
     // TODO Auto-generated method stub 
     locationManagerAsync = (LocationManager) ContextAsync.getSystemService(ContextAsync.LOCATION_SERVICE); 


     Criteria criteria = new Criteria(); 
     criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
     criteria.setCostAllowed(false); 
     criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); 
     providerAsync = locationManagerAsync.getBestProvider(criteria, false); 


     if (locationManagerAsync.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      providerAsync = LocationManager.GPS_PROVIDER; 
     } else if (locationManagerAsync.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
      providerAsync = LocationManager.NETWORK_PROVIDER; 
      /*AlertDialog.Builder alert = new AlertDialog.Builder(this); 
      alert.setTitle("GPS is disabled in the settings!"); 
      alert.setMessage("It is recomended that you turn on your device's GPS and restart the app so the app can determine your location more accurately!"); 
      alert.setPositiveButton("OK", null); 
      alert.show();*/   
     } else if (locationManagerAsync.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) { 
      providerAsync = LocationManager.PASSIVE_PROVIDER; 
      //Toast.makeText(ContextAsync, "Switch On Data Connection!!!!", Toast.LENGTH_LONG).show(); 
     }  

     location = locationManagerAsync.getLastKnownLocation(providerAsync); 
     // Initialize the location fields 
     if (location != null) { 
      // System.out.println("Provider " + provider + " has been selected."); 
      latAsync = location.getLatitude(); 
      lonAsync = location.getLongitude(); 

     } else { 
      //Toast.makeText(ContextAsync, " Locationnot available", Toast.LENGTH_SHORT).show(); 
     } 



     List<Address> addresses = null; 
     GeocoderAsync = new Geocoder(ContextAsync, Locale.getDefault()); 
     try { 
      addresses = GeocoderAsync.getFromLocation(latAsync, lonAsync, 1); 

      String address = addresses.get(0).getAddressLine(0); 
      String city = addresses.get(0).getAddressLine(1); 
      String country = addresses.get(0).getCountryName(); 
      AddressAsync = Html.fromHtml(
        address + ", " + city + ",<br>" + country).toString(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      AddressAsync = "Refresh for the address"; 
     } 



     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     super.onPostExecute(result); 
     progress.dismiss(); 
     onLocationChanged(location); 
     Log.v("latAsync_lonAsync",latAsync+"_"+lonAsync); 
     Intent intentAsync = new Intent(ContextAsync,Emerg.class); 
     intentAsync.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intentAsync.putExtra("calculated_Lat", latAsync); 
     intentAsync.putExtra("calculated_Lon", lonAsync); 
     intentAsync.putExtra("calculated_address", AddressAsync); 

     ContextAsync.startActivity(intentAsync); 

    } 



    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 
     locationManagerAsync.requestLocationUpdates(providerAsync, 0, 0, this); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

во первых, извините за принятие так долго для ответа. и большое вам спасибо за ваше время и помощь. Это сработало, и я узнал свои ошибки. У меня все еще есть некоторые проблемы. СПАСИБО!. – user2755646

+0

Очень приветствуется !! Пожалуйста, дайте мне знать, если я могу помочь больше. – sUndeep

1

вместо использования this.ContextAsync = context.getApplicationContext(); ContextAsync должен иметь Activity экземпляр, не ApplicationContext так не использовать this.ContextAsync = context

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