2011-07-27 6 views
1

나는 기본적으로 맵에 포인트를 플롯하는 안드로이드 앱을 가지고 있습니다. 이지도는 완전히 다른 클래스에서 결정됩니다. 원래이 클래스를 자체 프로그램으로 작성했습니다 (CSV 파일을 읽고 포인트를 선택하고 배열에서 경도와 위도를 다시 제공).Android 액티비티로 활동이없는 코드 실행하기

그래서 내가 한 것은이 클래스를 Android 앱에 추가 한 것입니다. 어떤 시점에서 배열을 생성하고 반환하고,이 새로운 배열을지도의 점을 그리기 위해 사용하는 클래스의 메서드를 호출하는 응용 프로그램을 원합니다. 배열을 잡고 각 위도와 경도를 찾아내는 것만 큼 멀리 할 수 ​​있습니다.

하지만, 내 안드로이드 응용 프로그램의 메인 클래스에서, 내가 언급 할 때 :

String[][] bump = ReadCsv.getArray(fileToUse); 

, 내 프로그램이 강제 종료됩니다. (ReadCsv는 내가 프로그램에 넣은 클래스의 이름입니다 - 클래스의 유일한 메소드에서 getArray를 가져오고 배열 [] []을 반환합니다).

누구나 내 문제가 무엇인지 알 것 같니? 대체 솔루션이 가능할 수 있습니까?

로그 캣은 : 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214) FATAL EXCEPTION : 메인 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214)가있는 java.lang. RuntimeException의 : 활동 ComponentInfo 시작할 수 없습니다 {net.learn2develop.GoogleMaps을/net.learn2develop.GoogleMaps.MapsActivity} : java.lang.NullPointerException이 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12214) : android.app에서. ActivityThread.performLaunchActivity (ActivityThread.java:2663) 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12214) : android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679) 07-27 15:19 : 25.105 : ERROR/AndroidRuntime (12214) : android.app.ActivityThread.access $ 2300 (ActivityThread.java:125) 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214) android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2033)에서 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214)에 android.os .Handler.dispatchMessage (Handler.java:99) 07-27 15 : 19 : ERROR/AndroidRuntime (12214) : android.os.Looper.loop (Looper.java:123)에서 07-27 25.105 15시 19분 : 25.105 : ERROR/AndroidRuntime (12214) : android.app.ActivityThread.main (ActivityThread.java:4627) 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12214) : java.lang.reflect.Method에서 .invokeNative (원시 메소드) 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214) java.lang.reflect.Method.invoke (Method.java:521)에서 07-27 15 : 19 : 25.105 : 오류/AndroidRuntime (12214) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858) 07-27 15:19 : 25.105 : ERROR/AndroidRuntime (12,214) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)에서 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214)에 dalvik.system. NativeStart.main (네이티브 메소드) 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12214) : 원인 : java.lang.NullPointerException 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12214) : at net.learn2develop.GoogleMaps.MapsActivity.onCreate (MapsActivity.java:86) 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12214) : android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) 07 -27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214) android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627)에서 07-27 15 : 19 : 25.105 : ERROR/AndroidRuntime (12,214) ...

더 (11) 그리고 내 코드는 다음과 같습니다

package net.learn2develop.GoogleMaps; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.List; 
import java.util.StringTokenizer; 

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 
import com.google.android.maps.MapView.LayoutParams; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.LinearLayout; 


public class MapsActivity extends MapActivity 
{  
MapView mapView; 
MapController mc; 
GeoPoint p; 
GeoPoint p2; 
GeoPoint p99; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mapView = (MapView) findViewById(R.id.mapView); 
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
    @SuppressWarnings("deprecation") 
    View zoomView = mapView.getZoomControls(); 

    mapView.setSatellite(true); 

    zoomLayout.addView(zoomView, 
     new LinearLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true); 

    mc = mapView.getController(); 
    String coordinates[] = {"42.30936432", "-71.12162781"}; 
    double lat = Double.parseDouble(coordinates[0]); 
    double lng = Double.parseDouble(coordinates[1]); 

    p = new GeoPoint(
      (int) (lat * 1E6), 
      (int) (lng * 1E6)); 

    mc.animateTo(p); 
    mc.setZoom(8); 

    //---Add a location marker--- 
    MapOverlay mapOverlay = new MapOverlay(); 
    List<Overlay> listOfOverlays = mapView.getOverlays(); 
    //listOfOverlays.clear(); 
    listOfOverlays.add(mapOverlay); 

    // -- my own point --- 
    String coordinates2[] = {"42.20", "-71.20"}; 
    double lat2 = Double.parseDouble(coordinates2[0]); 
    double lng2 = Double.parseDouble(coordinates2[1]); 
    p2 = new GeoPoint(
      (int) (lat2 * 1E6), 
      (int) (lng2 * 1E6)); 
    MapOverlay mapOverlay2 = new MapOverlay(); 
    List<Overlay> listOfOverlays2 = mapView.getOverlays(); 
    listOfOverlays2.add(mapOverlay2); 

    // Add points from ReadCsv.java 
    File fileToUse = new File("/Users/csrobot/Desktop/Training4.csv"); 
    String[][] bump = ReadCsv.getArray(fileToUse); 
    for(int i = 0; i < bump.length; i++) { 
     String coordinates99[] = {bump[i][0], bump[i][1]}; 
     double lat99 = Double.parseDouble(coordinates99[0]); 
     double lng99 = Double.parseDouble(coordinates99[1]); 
     p99 = new GeoPoint(
       (int) (lat99 * 1E6), 
       (int) (lng99 * 1E6)); 
     MapOverlay mapOverlay99 = new MapOverlay(); 
     List<Overlay> listOfOverlays99 = mapView.getOverlays(); 
     listOfOverlays99.add(mapOverlay99); 
    } 

    mapView.invalidate(); 
} 

class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean draw(Canvas canvas, MapView mapView, 
    boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     //---translate the GeoPoint to screen pixels--- 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(p, screenPts); 

     //---add the marker--- 
     Bitmap bmp = BitmapFactory.decodeResource(
       getResources(), R.drawable.redpin);    
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y-44, null);   


     // --make my own point--- 
     Point screenPts2 = new Point(); 
     mapView.getProjection().toPixels(p2, screenPts2); 
     Bitmap bmp2 = BitmapFactory.decodeResource(
       getResources(), R.drawable.redpin); 
     canvas.drawBitmap(bmp2, screenPts2.x, screenPts2.y-44, null); 


     return true; 
    } 
} 

static class ReadCsv { 

    public static String[][] getArray(File file) { 

     try { 
        // 
        // Code That I know Works is Here 
        // 
      return arrayOfBumps; 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch(Exception e) { 
        // System.out.println("The following error occurred "+e); 
     } 
     return null; 

    } 
} 

@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 
} 

편집 : 라비 밧이

private class MapPoint extends AsyncTask <String[][], String, String> { 

    @Override 
    protected String doInBackground(String[][]... <<What goes here...? >>) { 

    String << what am i making to return? >> = null; 
    try { 
     InputStream is = getAssets().open("Training4.csv"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     bump = getArray(reader); 
     if(bump == null){ 
       setContentView(R.layout.deleteme); 
      } else { 
       for(int i = 0; i < bump.length; i++) { 
        String coordinates99[] = {bump[i][0], bump[i][1]}; 
        double lat99 = Double.parseDouble(coordinates99[0]); 
        double lng99 = Double.parseDouble(coordinates99[1]); 
        p99 = new GeoPoint(
         (int) (lat99 * 1E6), 
         (int) (lng99 * 1E6)); 
        MapOverlay mapOverlay99 = new MapOverlay(); 
        List<Overlay> listOfOverlays99 = mapView.getOverlays(); 
        listOfOverlays99.add(mapOverlay99); 
       } 
      } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return << do I really need to return something? if so, what? >>; 
} 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    mapView.refreshDrawableState(); 

} 

} 
+1

응용 프로그램이 "강제 종료"될 때마다 일반적으로 logcat에서 사용할 수있는 오류 정보가 있습니다. 게시물에 해당 정보를 포함 시키십시오. 그렇지 않으면 문제가 무엇인지 추측 할 수 있습니다. –

답변

2

귀하의 필요에 가장 잘 맞는 것은 AsyncTask입니다. http://developer.android.com/reference/android/os/AsyncTask.html

doInBackground() 메서드에서 매개 변수를 전달할 수 있습니다. params는 위도와 경도의 목록 일 수 있습니다.

-

geopoing 만들기 - 방법은 다음을 수행()

onPostExectute을 항목별로 오버레이에 추가 -

overlayitem 만듭니다.

-지도 오버레이 즉 오버레이 목록에 추가합니다. - 그 후에 refreshdrawablestate() 메소드를 사용할 수 있습니다.

오버 액티브를 비 액티비티 클래스에서 가져 오려면 맵 액티비티의 참조 또는 컨텍스트를 사용하여 오버레이 추가에 사용할 수 있습니다.

편집 :

이 AsncTask를 사용하는 경우이 좌표의 배열을 가지고 예를 들어, 링크 http://developer.android.com/resources/tutorials/views/hello-mapview.html

에서 예를 들어지도보기을 고려 AsyncTask를 같은 PARAMS으로 AsyncTask를이 배열을 전달합니다.

다음 doInBackGround() 방법을 사용 doInBackGroud < 문자열 [] [] ... 변수 varName> 당신이 문자열 배열을 가지고있다. doInBackGround 메서드에서 좌표 및 Geopoint를 유도하는 루프 논리를 위해 놓으십시오.

- itemizedOverlay의 좌표에서 얻을 수있는 오버레이 항목을 각각 추가합니다 (안녕하세요 mapview 링크 별).

- onPostExecute() 메서드는지도의 목록에 해당 항목의 오버레이를 추가하고 mapview.refreshdrawablestate()를 사용합니다. 당신은 onPostExecute (무효 결과)처럼 선언 onPostExecute 사용할 수 있습니다

이해하고 DONE과 함께 위의 단계를 수행합니다!:)

+0

를 편집했다. 나의 편집 된 대답을 체크 아웃하고 어떤 질문이라도 대답한다면 .. :) –

+0

그것은 나에게 의미가있다! 그러나, 나는 약간에 관하여 조금 혼란 스럽다. 내 질문의 맨 아래에 게시 한 코드의 새로운 섹션을 살펴보고 내가 잘못했거나해야 할 일을 말해 주시겠습니까? doInBackground() 메소드의 params에있는 – Mxyk

+0

은 나중에 Geopoints 또는 좌표를 가져올 때 사용할 수있는 String [] [] 배열의 이름을 제공합니다. doInBackground() 메소드의 params에있는 –

0

당신이 힘을 가까이보고있는 많은 이유가있을 수 있습니다하십시오. 기본 방법을 실행하고 충돌이 발생한 곳을 보았습니까? 널 (NULL)을 전달할 때 크래시를 유발하는 것으로 매개 변수를 사용 중일 수 있습니다. 즉, 독립 실행 형 응용 프로그램에서 사용할 파일 이름을 전달 했습니까?

이 유형의 작업은 일반적으로 앱의 UI가 janky가되기 때문에 활동 내에서 수행되지 않습니다. IntentService를 조사하고 코드를 호출합니다. 그런 다음 UI에서 언제든지 IntentService를 호출 할 수 있습니다.

+0

나는 나의 logcat – Mxyk

0

Source 또는 Jar 파일에서 사용하고 있습니까? Jar 파일로 사용하는 경우 프로그램에서 Android에서 사용할 수없는 API를 사용하기 때문에 죽을 수도 있습니다. 다른 옵션은 args에 닿을 수 있습니다. ReadCSV.main (new String [] {})을 전달하려고합니다.

java.lang.NullPointerException이 표시되지만 서식 때문에 logcat을 살펴 보는 것이 어렵습니다. 하지만 ReadCSV 안에 뭔가 NPE를 던지고 있습니다. 디버거를 사용하여 ReadCSV를 단계별로 실행하거나 해당 NPE를 던지고있는 행의 행 번호를 찾으십시오.

net.learn2develop.GoogleMaps.MapsActivity.onCreate (MapsActivity.java:81)

그래서 MapsActivity 라인 (81)에 문제가 : 사실을 발견했다. ReadCSV.main()에 아직 도달하지 않은 것 같습니다.

또한이 작업을 AsyncTask 내부에서 수행 할 것을 제안합니다. ReadCSV.main()이 void 반환 형식이므로 모든 코드를 직접 호출하여 Array를 직접 호출 할 수있는 적절한 메서드로 분해하는 것도 고려해 볼 수 있습니다. 그래서 그것이 생산하는 것은 당신이 그 데이터를 얻을 수 있도록 파일이나 무언가 여야합니다. 대신에 그냥 일반 배열을 반환해야합니다. 다음과 같이하십시오 :

public List<Row> readCSV(File f) { 
} 

이렇게 쉽게 할 수 있습니다.

+0

에 대한 developer.android.com의 Hello-Mapview 예제를 참조하십시오. 실제로 하나의 클래스에 모든 것을 포함하도록 배열을 변경했지만 실제로 배열을 반환합니다. 여전히 동일한 오류가 발생하여 강제 종료되고 있습니다. 잠시만 기다려주십시오. – Mxyk

+0

ReadCSV에서 코드가 문제라고 생각하지 않습니다. 그 모습에서 MapActivity.onCreate() 메소드 줄 81은 문제가있는 곳입니다. MapsActivity는 ReadCSV 클래스 외부에 있으므로 null을 반환하지 않는 한 관련이 없습니다. – chubbsondubs

+0

이것은 81 행입니다 : listOfOverlays2.add (mapOverlay2); 내가 ReadCSV 클래스를 구현하려고 시도하기 전에 작동 했으므로 문제가 있다고 생각하지 않는 이상 문제는 아닌지 의심 스럽습니다. – Mxyk

관련 문제