Странное сообщение об ошибке от MapActivity - PullRequest
1 голос
/ 09 марта 2012

Я хотел бы попросить помощи, чтобы понять сообщение об ошибке.У меня есть приложение, загруженное на Android Market, или так называемые Google Play, в эти дни, и один из моих пользователей закрыл приложение и нажал кнопку «Отчет», и я получил его отчет.Что я знаю:

  • оно должно исходить из MapActivity моего приложения
  • У меня есть пользовательские маркеры на карте
  • на момент составления отчета сайтаможет быть вниз с того места, где я должен был бы получить данные для маркеров, поэтому возможно, что на момент отчета было 0 живых маркеров
  • Я думаю, что на моей стороне нет возможных ошибок нулевого указателя,Я думаю, что все это покрыто
  • максимальное количество маркеров равно 1 (да, пока это звучит глупо, я изменю это в будущем, так что хорошо, что приложение может обрабатывать несколько маркеров)
  • отчет об ошибке не содержит НИКАКОЙ ссылки на мой код, Stacktrace указывает на карты Android
  • из того, что я понимаю, какое-то действие масштабирования может вызвать все это, не уверен, что

Упомянутая трассировка стека:

java.lang.NullPointerException
at android.graphics.Canvas.<init>(Canvas.java:82)
at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:447)
at com.google.android.maps.ZoomHelper.doZoom(ZoomHelper.java:151)
at com.google.android.maps.ZoomHelper.doZoom(ZoomHelper.java:140)
at com.google.android.maps.MapView.doZoom(MapView.java:1478)
at com.google.android.maps.MapView.doZoom(MapView.java:1487)
at com.google.android.maps.MapView$6.onZoom(MapView.java:1442)
at android.widget.ZoomButtonsController$3.onClick(ZoomButtonsController.java:268)
at android.view.View.performClick(View.java:2420)
at android.view.View$PerformClick.run(View.java:8844)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

Я понятия не имею, что делать, даже если есть только этот 1 отчет от 2000 ~ пользователей, он по-прежнему вызывает меня, и я быхотел бы иметь это совместнои всегда хорошо, чтобы узнать что-то новое в конце дня.:)

Некоторые фрагменты из моего кода:

Вот как я создаю карту:

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map);

    isCentered=false;

    map = (MapView)findViewById(R.id.map_view);

    map=(MapView)findViewById(R.id.map_view);
    map.setBuiltInZoomControls(true);

    extras = this.getIntent().getExtras();
    if(extras!=null) code=extras.getString("code");

    if(!isOnline())
    {
        Toast.makeText(this, "Aktív internetkapcsolat szükséges!", Toast.LENGTH_SHORT).show();
        return;
    }

    refreshTrain();
}

После создания карты метод refreshTrain () запускает AsyncTask, который выбирает данные с веб-сайта и устанавливает маркеры в onPostExecute (параметр Void) следующим образом:

    protected void onPostExecute(Void param)
    {
        try 
        {
            if(result.length()<10) //the site is offline or the request is not valid
            {
                Toast.makeText(ctx, "Nem érhetőek el a térképadatok, próbáld később...", Toast.LENGTH_SHORT).show();
                return;
            }
            JSONObject json = new JSONObject(result); //parse the result and set up the coordinates
            latitude=json.getString("lat");
            longitude=json.getString("lon");
            double _lat=Double.parseDouble(latitude);
            double _lon=Double.parseDouble(longitude);
            int lat=(int)(_lat*1E6);
            int lon=(int)(_lon*1E6);

            event_time=getJson(json, "event_time"); //get additional informations about the train
            start_station=getJson(json, "start_station");
            end_station=getJson(json, "end_station");

            MapController mc = map.getController(); //set the markers
            List<Overlay> list = map.getOverlays();
            list.clear();
            Drawable drawable = getResources().getDrawable(R.drawable.pin);
            Markers markers = new Markers(drawable);
            GeoPoint p = new GeoPoint(lat, lon);
            OverlayItem item = new OverlayItem(p, "vonat", "snippet");
            markers.addOverlayItem(item);
            mc.setCenter(p);
            mc.animateTo(p);
            if(!isCentered) //dont change the zoom after each refresh, only on the first creation
            {
                mc.setZoom(12);
                isCentered=true;
            }

            list.add(markers);
        }
        catch(JSONException e)
        {
            Log.e(TAG,e.getMessage());
        }

    }
}

Наконец, мой класс маркеров выглядит следующим образом:

private class Markers extends com.google.android.maps.ItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

    public Markers(Drawable defaultMarker) {
        super(boundCenter(defaultMarker));
    }

    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    @Override
    public int size() {
        return mOverlays.size();
    }

    public void addOverlayItem(OverlayItem item)
    {
        mOverlays.add(item);
        populate();
    }

    @Override
    protected boolean onTap(int index) { //display the additional infos on tap
      AlertDialog.Builder dialog = new AlertDialog.Builder(ctx);
      dialog.setTitle("Frissítve: "+event_time);
      dialog.setMessage(start_station+" \u2192 "+end_station);
      dialog.show();
      return true;
    }

}

cheers

edit: код добавлен

edit2: из того, что я нашел до сих пор (не уверен), ошибка может появиться из сообщения Toast.Во время ошибок я не проверял бы, есть ли какое-либо активное соединение (нет isOnline () в onCreate), и не уведомлял бы пользователя, если сайт недоступен, поэтому, если это тост, он исходит отобновляя вещь в AsyncTask, который запускается в методе onPreExecute (), больше ничего не происходит.Я только догадываюсь, но может быть ...

1 Ответ

0 голосов
/ 19 марта 2012

Так как эта ошибка больше никогда не появлялась, я считаю, что это не проблема, даже если я никогда не узнал, что ее вызвало.

...