2014-07-21 34 views
1

我在Android中實現OpenStreetMap MapView時遇到了問題。 我使用OsmDroid庫: 問題是,當我點擊智能手機退出按鈕(中心)後,或者當我點擊最近的應用程序按鈕後,恢復應用程序時,地圖不顯示,視圖停在一個黑色屏幕。沒有顯示ANR。 logcat中沒有異常消息。沒有異常打印。只有一個黑屏。使用OsmDroid的MapView中的黑屏

什麼問題? 我試圖調試應用程序,但我沒有發現異常。 這是代碼:

package it.presenteapp.ui; 

import it.presenteapp.R; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 

import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

import android.widget.TextView; 
import android.widget.Toast; 

import org.osmdroid.DefaultResourceProxyImpl; 
import org.osmdroid.api.IGeoPoint; 

import org.osmdroid.tileprovider.tilesource.TileSourceFactory; 

import org.osmdroid.util.GeoPoint; 

import org.osmdroid.views.MapView; 
import org.osmdroid.views.overlay.ItemizedIconOverlay; 
import org.osmdroid.views.overlay.MinimapOverlay; 
import org.osmdroid.views.overlay.OverlayItem; 
import org.osmdroid.views.overlay.PathOverlay; 
import org.osmdroid.views.overlay.ScaleBarOverlay; 
import org.osmdroid.views.overlay.compass.CompassOverlay; 
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; 


import java.util.ArrayList; 
import java.util.Timer; 
import java.util.TimerTask; 

import it.presenteapp.network.NetworkResource; 
import it.presenteapp.network.classForJSON.RouteResponse; 
import it.presenteapp.utils.Config; 

public class MapActivity extends Activity 
{ 
    private MapView mOsmv; 
    private Timer timerTask; 
    private boolean networkProviderEnabled; 
    private RouteResponse Route; 
    private GeoPoint currentLocation; 

    private Boolean doBackground =false; 

    private MyLocationNewOverlay partenza; 
    private GeoPoint arrivo; 
    private PathOverlay pathOverlay; 
    private Paint paint; 
    private MinimapOverlay miniMapOverlay; 
    private ScaleBarOverlay scaleBar; 
    private CompassOverlay compassOverlay; 

    private String nomeCognome; 




    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map); 

     this.mOsmv = (MapView)findViewById(R.id.mapview); 

     Intent i=getIntent(); 
     this.nomeCognome = i.getStringExtra("NomeCognome"); 
     this.arrivo= new GeoPoint(i.getDoubleExtra("Latitudine",43.6156683),i.getDoubleExtra("Longitudine",13.5177356)); 

     getActionBar().setTitle("Ricerca loculo: "+ nomeCognome); 



    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     Log.e("MAPACTIVITY", "RESUME CALLED"); 

     this.mOsmv.setTileSource(TileSourceFactory.CYCLEMAP); 
     this.mOsmv.setUseDataConnection(true); 
     this.mOsmv.setBuiltInZoomControls(true); 
     this.mOsmv.setMultiTouchControls(true); 
     this.mOsmv.setMinZoomLevel(4); 
     this.mOsmv.getController().setZoom(this.mOsmv.getMaxZoomLevel()); 

     Log.e("1", "ok"); 
     /* setto il marker di arrivo */ 
     Drawable markerArrivo = this.getResources().getDrawable(R.drawable.arrivo); 
     ArrayList listItem = new ArrayList<OverlayItem>(); 
     final OverlayItem itemArrivo = new OverlayItem(this.nomeCognome, "nato il "+ "\n"+ "morto il ", arrivo); 
     itemArrivo.setMarker(markerArrivo); 
     listItem.add(itemArrivo); 
     this.mOsmv.getOverlayManager().clear(); 
     this.mOsmv.getOverlayManager().add(new ItemizedIconOverlay<OverlayItem>(listItem, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { 
      @Override 
      public boolean onItemSingleTapUp(int index, OverlayItem item) { 
       Toast.makeText(getApplicationContext(),itemArrivo.getTitle()+"\n"+itemArrivo.getSnippet(),Toast.LENGTH_SHORT).show(); 
       return false; 
      } 

      @Override 
      public boolean onItemLongPress(int index, OverlayItem item) { 
       //Toast.makeText(getApplicationContext(),"LUUUNGO",Toast.LENGTH_SHORT).show(); 
       return false; 
      } 
     }, new DefaultResourceProxyImpl(getApplicationContext()))); 
     Log.e("2", "ok"); 
     /* setto il marker di partenza/attuale posizione dell'utente */ 
     partenza = new MyLocationNewOverlay(getApplicationContext(),this.mOsmv); 
     partenza.enableFollowLocation(); 
     partenza.enableMyLocation(); 

     this.mOsmv.getOverlayManager().add(partenza); 
     Log.e("3", "ok"); 
     /* aggiungo la scala della mappa */ 
     scaleBar = new ScaleBarOverlay(this.getBaseContext(), this.mOsmv.getResourceProxy()); 
     scaleBar.setCentred(true); 
     this.mOsmv.getOverlayManager().add(scaleBar); 

     Log.e("4", "ok"); 
     /* aggiungo la bussola della mappa */ 
     compassOverlay = new CompassOverlay(this, this.mOsmv); 
     compassOverlay.enableCompass(); 
     this.mOsmv.getOverlayManager().add(compassOverlay); 
     Log.e("5", "ok"); 
     /* aggiungo la mini mappa */ 
     miniMapOverlay = new MinimapOverlay(this, this.mOsmv.getTileRequestCompleteHandler()); 
     this.mOsmv.getOverlayManager().add(miniMapOverlay); 
     Log.e("6", "ok"); 
     /* setto le proprietà del disegno della rotta */ 
     this.paint = new Paint(); 
     paint.setColor(Color.BLUE); 
     paint.setAlpha(100); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeWidth(8); 
     Log.e("7", "ok"); 
     /* inizializzo il routing via Graphopper */ 
     this.startGraphopperTask(); 
     Log.e("9", "ok"); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     Log.e("MAPACTIVITY","PAUSE CALLED"); 

     this.timerTask.cancel(); 
     this.mOsmv.setBuiltInZoomControls(false); 
     setVisible(false); 
     this.partenza.disableMyLocation(); 
     this.partenza.disableFollowLocation(); 
     this.mOsmv.getTileProvider().detach(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.map, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     switch (item.getItemId()) 
     { 
      case R.id.action_shortcut_map_credits: 
       Toast.makeText(this,"@ Univpm", Toast.LENGTH_SHORT).show(); 
       return true; 

      case android.R.id.home: 
       onBackPressed(); 
       return true; 

      default: 
       Log.e("premuto","altro"); 
     } 
     return super.onOptionsItemSelected(item); 
    } 


    @Override 
    protected void onDestroy() 
    { 
     Log.e("MAPACTIVITY","DESTROY CALLED"); 
     super.onDestroy(); 
    } 

    public void drawRoute(RouteResponse _Route) 
    { 
     if(this.pathOverlay != null) 
      this.mOsmv.getOverlayManager().remove(this.pathOverlay); 

     Log.e("new position","setted!"); 

     PathOverlay newPathOverlay = new PathOverlay(Color.RED,MapActivity.this); 
     newPathOverlay.addPoints(_Route.getPaths()[0].getPoints().getCoordinatesGeoPoint()); 
     newPathOverlay.setPaint(this.paint); 

     this.mOsmv.getOverlays().add(newPathOverlay); 
     this.pathOverlay = newPathOverlay; 

     TextView istruzioni= (TextView) findViewById(R.id.popup_ins); 
     istruzioni.setText(_Route.getPaths()[0].getInstructions()[0].getText()); 
     istruzioni.setVisibility(TextView.VISIBLE); 

     doBackground=false; 

    } 
    public void centerPosition(View v) 
    { 
     this.mOsmv.getController().animateTo((IGeoPoint) partenza.getMyLocation()); 
     while (true) 
     { 
      if (!this.mOsmv.isAnimating()) 
      { 
       this.mOsmv.getController().setZoom(this.mOsmv.getMaxZoomLevel()); 
       return; 
      } 

     } 
    } 
    private class GraphopperTask extends AsyncTask<Void, Void, Void> 
    { 
     RouteResponse puntiRotta; 

     @Override 
     protected void onPreExecute() 
     { 
      Log.e("task ricerc route", "partito!"); 
      super.onPreExecute(); 
      // before making http calls 

     } 

     @Override 
     protected Void doInBackground(Void... arg0) 
     { 

      NetworkResource net =new NetworkResource(); 
      if(partenza.getMyLocation() != null) 
      { 
       try { 
        Log.e("FASE PRE-CHIAMATA ROUTE", "CORRETTA"); 
        String StartPoint = new StringBuilder().append(partenza.getMyLocation().getLatitudeE6()/1E6).append(",") 
          .append(partenza.getMyLocation().getLongitudeE6()/1E6).toString(); 
        String EndPoint = new StringBuilder().append(arrivo.getLatitudeE6()/1E6).append(",") 
          .append(arrivo.getLongitudeE6()/1E6).toString(); 
        puntiRotta = net.getRoute(StartPoint, EndPoint); 
        Log.e("StartPoint", StartPoint); 
        Log.e("EndPoint", EndPoint); 
        Log.e("FASE PARSING ROUTE", "CORRETTA"); 
       } catch (Exception e) { 
        Log.e("ERRORE", e.toString()); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) 
     { 
      super.onPostExecute(result); 
      // After completing http call 
      // will close this activity and launch main activity 
      Route=puntiRotta; 
      drawRoute(Route); 
     } 

    } 

    private void startGraphopperTask() 
    { 
     final Handler handler = new Handler(); 
     this.timerTask = new Timer(); 
     TimerTask doAsynchronousTask = new TimerTask() 
     { 
      @Override 
      public void run() 
      { 
       handler.post(new Runnable() 
       { 
        public void run() 
        { 
         try 
         { 
          if(partenza.getMyLocation() != null) 
          { 
           GraphopperTask graphopperTask = new GraphopperTask(); 
           // PerformBackgroundTask this class is the class that extends AsynchTask 

           graphopperTask.execute(); 
          } 
         } catch (Exception e) 
         { 

         } 
        } 
       }); 
      } 
     }; 
     this.timerTask.schedule(doAsynchronousTask, Config.startRouteDelay, Config.updateRouteInterval); 
     Log.e("8", "ok"); 
    } 

} 
+0

什麼是ANR?您的暫停名爲setVisible(false),但Resume不會將其設置爲true – erik

+0

@erik ANR是Application Not Responding。 – trullallero

回答

2

的問題是,您所呼叫調用setVisible(假)中的onPause(),而不是調用setVisibile(真)在的onResume()。 考慮到在這種情況下你不需要使用setVisible(bool)方法;根據Android文檔(鏈接):

公共無效調用setVisible(布爾可見)在API級別3控制 是否本次活動的主窗口visible.This只 用於活動的特殊情況是不會顯示UI 本身,但不能僅在onResume()之前完成,因爲它需要 等待服務綁定等。將其設置爲false可讓您 防止您在此期間顯示您的用戶界面。此值的默認值 取自 活動主題的windowNoDisplay屬性。