Witam, napisałem prostą apkę, które łączy się z serwerem i pobiera z niego dane o pogodzie. Można wpisywać miasto lub pozwolić aplikacji na wykrycie nas po lokalizacji gps. Niestety, co kilka zapytań aplikacja crashuje, czasami zdarza jej się to od razu po uruchomieniu. Do pobrania danych używam Async Taska. Wrzucam kod MainActivity i będę wdzięczny za jakieś sugestie co tutaj może być nie tak.
package com.example.sebastian.pogodainfo;
public class MainActivity extends Activity {
private TextView miasto;
private TextView opisWarunkow;
private TextView temperatura;
private TextView predkoscWiatru;
private TextView windDeg;
private TextView cisnienie;
private TextView wilgotnosc;
private Button ustalPolozenie;
private Button zmianaMiastaPrzycisk;
private ImageView ikonka;
private String miastko;
private TextView dl;
private TextView szer;
private TextView info;
private String dlStr;
private String szerStr;
private JSONPogodaTask task;
private String zmienZnaki(String aa)
{
String input = aa.toLowerCase();
String tmp = input.replace("ą", "a");
tmp = tmp.replace("ć","c");
tmp = tmp.replace("ę", "e");
tmp = tmp.replace("ł", "l");
tmp = tmp.replace("ń", "n");
tmp = tmp.replace("ó", "o");
tmp = tmp.replace("ś", "s");
tmp = tmp.replace("ź", "z");
tmp = tmp.replace("ż", "z");
String output = tmp.replace(" ", "-");
return output;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
miastko = "Lodz";
miasto = (TextView) findViewById(R.id.miasto);
opisWarunkow = (TextView) findViewById(R.id.opisWarunkow);
temperatura = (TextView) findViewById(R.id.temperatura);
predkoscWiatru = (TextView) findViewById(R.id.predkoscWiatru);
windDeg = (TextView) findViewById(R.id.windDeg);
cisnienie = (TextView) findViewById(R.id.cisnienie);
wilgotnosc = (TextView) findViewById(R.id.wilgotnosc);
ikonka = (ImageView) findViewById(R.id.ikonka);
dl = (TextView) findViewById(R.id.dl);
szer = (TextView) findViewById(R.id.szer);
info = (TextView) findViewById(R.id.info);
task = new JSONPogodaTask();
task.execute(new String[]{ustalAdresMiasto(zmienZnaki(miastko))});
Button zmianaMiastaPrzycisk = (Button) findViewById(R.id.zmianaMiastaPrzycisk);
Button ustalPolozenie = (Button) findViewById(R.id.ustalPolozenie);
zmianaMiastaPrzycisk.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v){
EditText zmianaMiasta = (EditText) findViewById(R.id.zmianaMiasta);
miastko = zmianaMiasta.getText().toString();
task.cancel(true);
task = new JSONPogodaTask();
task.execute(new String[]{ustalAdresMiasto(zmienZnaki(miastko))});
}
});
ustalPolozenie.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Criteria kryteria = new Criteria();
LocationManager locman =(LocationManager)getSystemService(LOCATION_SERVICE);
String najlepszyDostawca=locman.getBestProvider(kryteria,true);
Location lokalizacja=locman.getLastKnownLocation(najlepszyDostawca);
MyLocationListener locListener = new MyLocationListener();
locman.requestLocationUpdates(najlepszyDostawca,1000,1,locListener);
info.setText("Znajdujesz się na współrzędnych, pogoda została dla nich ustalona: ");
szer.setText("Szerokosc geograficzna: " +Double.toString(lokalizacja.getLongitude()));
dl.setText("Dlugosc geograficzna: " +lokalizacja.getLatitude());
szerStr=(Double.toString(lokalizacja.getLatitude()));
dlStr=(Double.toString(lokalizacja.getLongitude()));
task.cancel(true);
task = new JSONPogodaTask();
task.execute(new String[]{ustalAdresKoordynaty(szerStr,dlStr)});
}
});
}
public String ustalAdresMiasto(String miasto)
{
return "http://api.openweathermap.org/data/2.5/weather?q="+miasto;
}
public String ustalAdresKoordynaty(String szer, String dl)
{
return "http://api.openweathermap.org/data/2.5/weather?lat="+szer+"&"+"lon=" + dl;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
private class JSONPogodaTask extends AsyncTask<String, Void, Pogoda>
{
private boolean zmieniac;
@Override
protected Pogoda doInBackground(String... params) {
Pogoda pogoda = new Pogoda();
String data = ((new KlientHTTP()).getWeatherData(params[0]));
if(data.length()>200) {
try {
pogoda = JSONParser.getPogoda(data);
// Let's retrieve the icon
pogoda.daneIkony = ((new KlientHTTP()).getImage(pogoda.warunkiPogodowe.getIkona()));
zmieniac=true;
} catch (JSONException e) {
e.printStackTrace();
}
}
else zmieniac=false;
return pogoda;
}
@Override
protected void onPostExecute(Pogoda pogoda) {
super.onPostExecute(pogoda);
if(zmieniac==true) {
miasto.setText(pogoda.lokalizacja.getMiasto() + "," + pogoda.lokalizacja.getKraj());
/* if (pogoda.daneIkony != null && pogoda.daneIkony.length > 0) {
Bitmap img = BitmapFactory.decodeByteArray(pogoda.daneIkony, 0, pogoda.daneIkony.length);
// ikonka.setImageBitmap(img); // Teraz jest zeskalowana
ikonka.setImageBitmap(Bitmap.createScaledBitmap(img, 200, 200, false));
}*/
miasto.setText(pogoda.lokalizacja.getMiasto() + "," + pogoda.lokalizacja.getKraj());
opisWarunkow.setText(pogoda.warunkiPogodowe.getOpis());
temperatura.setText("" + Math.round((pogoda.temperatura.getTemperatura() - 273.15)) + "°C");
wilgotnosc.setText("" + pogoda.warunkiPogodowe.getWilgotnosc() + "%");
cisnienie.setText("" + pogoda.warunkiPogodowe.getCisnienie() + " hPa");
predkoscWiatru.setText("" + pogoda.wiatr.getPredkosc() + " m/s");
windDeg.setText("" + pogoda.wiatr.getDeg() + "°");
}
else
{
miasto.setText("Zle miasto");
opisWarunkow.setText("Zle miasto");
temperatura.setText("Zle miasto");
wilgotnosc.setText("Zle miasto");
cisnienie.setText("Zle miasto");
predkoscWiatru.setText("Zle miasto");
windDeg.setText("Zle miasto");
}
cancel(true);
}
}
}