Autore Topic: AsyncTask e Mapactivity  (Letto 798 volte)

Offline cybergatto

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid MT
  • Play Store ID:
    Lorenzo Mao
  • Sistema operativo:
    Windows 7, Ubuntu 11.10
AsyncTask e Mapactivity
« il: 21 Maggio 2012, 23:02:56 CEST »
0
Buongiorno a tutti,
da ore sto spulciando senza risultati la rete alla ricerca di qualcosa che mi possa aiutare a mettere daccordo una MapActivity e un Asynctask.
In pratica devo aggiungere degli item all'overlay di una mapview usando dei risultati resuperati da una query a un db esterno fatta in una AsyncTask.
Per farlo prima dalla mapactivity chiamo l'AsyncTask con:

Codice (Java): [Seleziona]
MyAsyncTask.execute
e nel onPostExecute dell'AsyncTask chiamo un metodo della mia Mapactivity che dovrebbe popolare l'overlay, il problema è che quando io chiamo questo metodo l'oggetto MapView che ho creato nell'oncreate della mapactivity risulta NULL con conseguente eccezione.
Qualcuno sa dirmi dove sto sbagliando?

di seguito il codice della mapactivity e del task.

Codice (Java): [Seleziona]
public class IMetanoActivity extends MapActivity {
       
        public JSONArray qResult;
        List<Overlay> mapOverlays;
        public MapView mMapView;
        IMetanoDB metanoDB;
    IMetanoItemizedOverlay itemizedoverlay;
        boolean workinprogress=false;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        metanoDB = new IMetanoDB();

       
        mMapView = (MapView) findViewById(R.id.mapview);
       
        mMapView.setBuiltInZoomControls(true);
       
        mapOverlays = mMapView.getOverlays();
       
        Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
        itemizedoverlay = new IMetanoItemizedOverlay(drawable, this);
        mapOverlays.add(itemizedoverlay);
       

        submitRepopulate();
       
    }

    public void submitRepopulate(){
        GeoPoint mapcenter = mMapView.getMapCenter();
        metanoDB.execute("select latitudine, longitudine from distributori WHERE latitudine >= " + Integer.toString(mapcenter.getLatitudeE6()-(mMapView.getLatitudeSpan()/2)) + " AND latitudine <= " + Integer.toString(mapcenter.getLatitudeE6()+(mMapView.getLatitudeSpan()/2)) + " AND longitudine >= " + Integer.toString(mapcenter.getLongitudeE6()-(mMapView.getLongitudeSpan()/2)) + " AND longitudine <= " + Integer.toString(mapcenter.getLongitudeE6()+(mMapView.getLongitudeSpan()/2)) + " limit 5");
    }
   
        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return false;
        }
       
        public void Repopulate(JSONArray res){
        if (!workinprogress){
                workinprogress=true;
            System.out.println(res.toString());
            //mMapView.getOverlays().clear();
            List<Overlay> mapOverlays = mMapView.getOverlays();
            JSONArray dist = res;
           
           
            for(int i = 0; i < dist.length(); i++){
                JSONObject disto;
                                try {
                                        disto = dist.getJSONObject(i);
                                        GeoPoint point = new GeoPoint(disto.getInt("latitudine"), disto.getInt("longitudine"));
                        OverlayItem overlayitem = new OverlayItem(point, "Sekai, konichiwa!", "I'm in Japan!");
                        itemizedoverlay.addOverlay(overlayitem);
                                } catch (JSONException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                mapOverlays.add(itemizedoverlay);
            }
            workinprogress=false;
        }
        }

Codice (Java): [Seleziona]
public class IMetanoDB extends AsyncTask<String, Integer , JSONArray>{
//      IMetanoDB(){
                //stub
//      }
        JSONArray qResult;
       
        protected JSONArray doInBackground(String... params){
                   
                InputStream is = null;
                String Query = params[0];
                   String result = "";
                    //the year data to send
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("query",Query));

                    //http post
                    try{
                            HttpClient httpclient = new DefaultHttpClient();
                            HttpPost httppost = new HttpPost("http://www.**.tk/database.php");
                            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                            HttpResponse response = httpclient.execute(httppost);
                            HttpEntity entity = response.getEntity();
                            is = entity.getContent();

                    }catch(Exception e){
                            Log.e("log_tag", "Error in http connection "+e.toString());
                    }

                    //convert response to string
                    try{
                            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                            StringBuilder sb = new StringBuilder();
                            String line = null;
                            while ((line = reader.readLine()) != null) {
                                    sb.append(line + "\n");
                            }
                            is.close();
                            result=sb.toString();
                    }catch(Exception e){
                            Log.e("log_tag", "Error converting result "+e.toString());
                    }
                    //parse json data
                    JSONArray jArray = null;
                    try{
                            jArray = new JSONArray(result);
                    }catch(JSONException e){
                            Log.e("log_tag", "Error parsing data "+e.toString());
                    }
                    return jArray;
        }
       
    protected void onPostExecute(JSONArray result) {
        qResult = result;
        IMetanoActivity mt = new IMetanoActivity();
        mt.Repopulate(result);
        System.out.println("finito");
    }
   
    public JSONArray queryrs(){
        return qResult;
    }

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:AsyncTask e Mapactivity
« Risposta #1 il: 21 Maggio 2012, 23:09:19 CEST »
0
Prova a passare all'asynctask la tua classe IMetanoActivity e usa quella passata e non  crearne una nell'asyn oppure più velocemente crea la classe asynk come inner dell IMetanoActivity
Odio l'inglese e per un informatico non è il massimo

Offline cybergatto

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid MT
  • Play Store ID:
    Lorenzo Mao
  • Sistema operativo:
    Windows 7, Ubuntu 11.10
Re:AsyncTask e Mapactivity
« Risposta #2 il: 21 Maggio 2012, 23:14:35 CEST »
0
Prova a passare all'asynctask la tua classe IMetanoActivity e usa quella passata e non  crearne una nell'asyn oppure più velocemente crea la classe asynk come inner dell IMetanoActivity

Grazie del consiglio, immaginavo di dover fare qualcosa del genere, ma non ho idea di come fare... riesci a darmi qualche dritta?

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:AsyncTask e Mapactivity
« Risposta #3 il: 21 Maggio 2012, 23:39:31 CEST »
0
togli il public all'async e copialo brutalmente nella classe IMetano activity. Dove allocavi IMetano nell'async toglilo e per riferti ad esso usa IMetanoActivity.this.metodochetiserve
Odio l'inglese e per un informatico non è il massimo

Offline cybergatto

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid MT
  • Play Store ID:
    Lorenzo Mao
  • Sistema operativo:
    Windows 7, Ubuntu 11.10
Re:AsyncTask e Mapactivity
« Risposta #4 il: 22 Maggio 2012, 01:00:30 CEST »
0
Grazie, ora funziona alla perfezione!