de mon Question précédente
Je reçois NullChetor Exception. J'ai donc fait des changements dans mon code et maintenant la barre de progression s'affiche, mais obtenez les erreurs ci-dessous. P>
public class JsonExampleActivity extends ListActivity { /** Called when the activity is first created. */ ProgressDialog mDialog; final String TAG="a.c.b"; JSONFunction JSONfunction; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listplaceholder); new JSONPasingShowList().execute(); } public void updateWithNewLocation(Location location2) { if(location2!=null) { double geoLat = location2.getLatitude(); double geoLng = location2.getLongitude(); } } class JSONPasingShowList extends AsyncTask<String, Integer,ArrayList<HashMap<String,String>>> { @Override protected void onPreExecute() { super.onPreExecute(); mDialog = new ProgressDialog(JsonExampleActivity.this); mDialog.setCancelable(true); mDialog.setMessage("Loading..."); mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mDialog.setProgress(0); mDialog.show(); } @Override protected ArrayList<HashMap<String,String>> doInBackground(String... params) { double latitude[]=new double[20]; double longitude[]=new double[20]; String reference[]=new String[20]; double distance[]=new double[20]; LocationManager locationManager; String context=Context.LOCATION_SERVICE; locationManager=(LocationManager)getSystemService(context); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = locationManager.getBestProvider(criteria, true); Location location = locationManager.getLastKnownLocation(provider); final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { updateWithNewLocation(location); } public void onProviderDisabled(String provider){ updateWithNewLocation(null); } public void onProviderEnabled(String provider){ } public void onStatusChanged(String provider, int status, Bundle extras){ } }; updateWithNewLocation(location); locationManager.requestLocationUpdates(provider, 2000, 10, locationListener); double geoLat = location.getLatitude(); Log.v(TAG, "hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"+geoLat); double geoLng = location.getLongitude(); Log.v(TAG, "hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"+geoLng); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); JSONObject json=JSONFunction.getJSONfromURL("https://maps.googleapis.com/maps/api/place/search/json?location=37.422006,-122.084095&radius=1000&types=doctor&sensor=true&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); try{ JSONArray JArray = json.getJSONArray("results"); Log.v(TAG, "getting results"); for(int i=0;i<JArray.length();i++){ HashMap<String, String> map = new HashMap<String, String>(); JSONObject e = JArray.getJSONObject(i); JSONObject location1=e.getJSONObject("geometry").getJSONObject("location"); latitude[i]=location1.getDouble("lat"); longitude[i]=location1.getDouble("lng"); reference[i]=e.getString("reference"); Log.v(TAG, reference[i]); distance[i]=GetLatAndLng.gps2m(geoLat, geoLng,latitude[i] ,longitude[i]); map.put("id", String.valueOf(i)); map.put("name", "" + e.getString("name")); map.put("vicinity", "Address " + e.getString("vicinity")+" "+"Disance:"+distance[i]); mylist.add(map); } }catch(JSONException e) { Log.e("log_tag", "Error parsing data "+e.toString()); } final Intent intent=new Intent(JsonExampleActivity.this ,GetLatAndLng.class); Bundle b=new Bundle(); b.putStringArray("key", reference); intent.putExtras(b); return mylist; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } protected void onPostExecute(ArrayList<HashMap<String, String>> result) { mDialog.dismiss(); ListAdapter adapter = new SimpleAdapter(JsonExampleActivity.this, result , R.layout.listview, new String[] { "name", "vicinity", }, new int[] { R.id.item_title, R.id.item_subtitle }); setListAdapter(adapter); mDialog.dismiss(); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position); Toast.makeText(JsonExampleActivity.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); final Intent intent=new Intent(JsonExampleActivity.this ,GetLatAndLng.class); intent.putExtra("clickedid",position); startActivity(intent); } }); } public class MySimpleAdapter extends SimpleAdapter { public MySimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); // TODO Auto-generated constructor stub } } } }
3 Réponses :
@Override protected void onProgressUpdate(Location... locations) { super.onProgressUpdate(values); updateWithNewLocation(location); }
Merci de pointer que pouvez-vous me dire ce que j'accède à DoinbackGroung.
Vous êtes très bienvenu! Je suis content que vous avez résolu votre problème! :-) Maintenant, quelqu'un voudra-t-il voter cela afin que je reçois le badge du mortier lol! :-P juste plaisanter, juste plaisanter ...
Maintenant, un nouveau problème surviennent GetLaTandlong ActVivivy Donner ForceClose.it un problème d'intention.
Vous accédez à quelque chose sur le fil de l'interface utilisateur de l'intérieur doinkbackground. Et ce n'est pas permis. Code> Ceci est vieux mais utile, je définirais un adaptateur vers une liste de réception. Je suppose que cela appartient aussi aux affaires de l'interface utilisateur.
Vous faites un tas de choses dans votre doinbackground () code> que vous n'avez pas besoin de faire là-bas. Seulement fait les choses dans votre
doinbackground () code> méthode qui causerait le bégaiement sur le fil de l'interface utilisateur. En d'autres termes, tout le code qui ne traite pas directement de votre communication réseau doit être déplacé de votre
DOINBackground () code> méthode. P>
C'est exactement pourquoi il est précieux de commencer à comprendre quelques bases autour de la filetage au lieu de simplement dire "asynccaptask" pour tout ce qui semble être enfermé à distance dans Android. Multi-threading peut être délicat et vous devez penser les choses à travers. P>
Je soupçonne que c'est ce qui se passe: vous avez un massif d'asyncaptage qui, entre autres, obtient l'emplacement ... de manière asynchrone. Cela signifie que vous démarrez sur le thread principal, vous exécutez juste basé sur un coup d'œil à votre code, je soupçonne que vous souhaitez faire appel à l'appel de l'API Google Maps après avoir obtenu votre position, non? Si tel est le cas, appelez votre code «Obtenir l'emplacement» de manière synchrone. Dans le rappel à cela, vous pouvez mettre le code pour lancer votre masque d'asyncaptage qui ne fait désormais que l'appel et le traitement de l'API Google. P> doInfbackground code> dans un autre fil implicitement (le fil de l'asyncaptage), puis vous appelez à quel point le thread effectue votre acquisition de votre site. Ensuite, votre fil d'asyncaptage continue, terminant tous les travaux liés à JSON dans
DOINbackground code>, probablement terminé. Le thread d'asyncaptage se termine probablement. alors em> vous obtenez votre lock de localisation et que l'auditeur que vous avez fourni est appelé retour, sauf que maintenant, l'asyncaptasque est déjà terminé et que son thread n'est plus valide. P>