2011-07-27 25 views
1

我有一个基本上只绘制地图上的点的Android应用程序。 这些地图是由完全不同的课程确定的。 我最初编写这个类作为自己的程序(它读取一个CSV文件并挑选出点并在数组中返回它们的经度和纬度)。获取Android活动运行非活动代码

因此,我所做的是将这个类添加到我的Android应用程序。我希望应用程序在某个时刻调用该类的方法,该方法将生成数组,并将其返回,然后使用此新数组在地图上绘制点。至于抓住阵列并确定每个纬度和经度,我可以做到。

然而,当我的Android应用程序的主类,我声明:

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

,我的程序将强制关闭。 (ReadCsv是我在程序中放置的类的名称 - getArray是类中唯一的方法,它返回一个数组[] [])。

有没有人认为他们看到我的问题是什么?也许有其他解决方案是可能的?

的logcat的是: 07-27 15:19:25.105:ERROR/AndroidRuntime(12214):致命异常:主 07-27 15:19:25.105:ERROR/AndroidRuntime(12214):java.lang中。 RuntimeException:无法启动活动ComponentInfo {net.learn2develop.GoogleMaps/net.learn2develop.GoogleMaps.MapsActivity}:java.lang.NullPointerException 07-27 15:19:25.105:错误/ AndroidRuntime(12214):在android.app。 ActivityThread.performLaunchActivity(ActivityThread.java:2663) 07-27 15:19:25.105:ERROR/AndroidRuntime(12214):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 07-27 15:19: 25.105:错误/ AndroidRuntime(12214):在android.app.ActivityThread.access $ 2300(ActivityThread.java:125) 07-27 15 :19:25.105:错误/ AndroidRuntime(12214):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033) 07-27 15:19:25.105:错误/ AndroidRuntime(12214):在android.os .Handler.dispatchMessage(Handler.java:99) 07-27 15:19:25.105:ERROR/AndroidRuntime(12214):at android.os.Looper.loop(Looper.java:123) 07-27 15:19 :25.105:错误/ AndroidRuntime(12214):在android.app.ActivityThread.main(ActivityThread.java:4627) 07-27 15:19:25.105:错误/ AndroidRuntime(12214):在java.lang.reflect.Method .invokeNative(Native Method) 07-27 15:19:25.105:ERROR/AndroidRuntime(12214):at java.lang.reflect.Method.invoke(Method.java:521) 07-27 15:19:25.105:错误/ AndroidRuntime(12214):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858) 07-27 15:19: 25.105:错误/ AndroidRuntime(12214):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 07-27 15:19:25.105:错误/ AndroidRuntime(12214):在dalvik.system。 NativeStart.main(本地方法) 07:27:15:19:25.105:错误/ AndroidRuntime(12214):导致:java.lang.NullPointerException 07-27 15:19:25.105:错误/ AndroidRuntime(12214):at net.learn2develop.GoogleMaps.MapsActivity.onCreate(MapsActivity.java:86) 07-27 15:19:25.105:ERROR/AndroidRuntime(12214):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 07 -27 15:19:25.105:错误/ AndroidRuntime(12214):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 07-27 15:19:25.105:错误/ AndroidRuntime(12214):...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()方法。参数可以是经度和纬度的列表。

- 让geopoing

- 创建overlayitem

- 在逐项叠加添加它

onPostExectute()方法做以下。

- 将其添加到地图叠加,即叠加列表。 - 之后您可以使用refreshdrawablestate()方法。

用于从非活动类放置该叠加层,您可以使用mapactivity的引用或上下文并将其用于添加叠加层。

编辑:

例如,从链接http://developer.android.com/resources/tutorials/views/hello-mapview.html

考虑的例子MapView的使用AsncTask,你有坐标的数组,在传递的AsyncTask这个数组像的AsyncTask PARAMS。

然后doInBackGround()方法使用doInBackGroud <字符串[] [] ...的varName>你有字符串数组。将该循环逻辑放在doInBackGround方法中派生坐标和Geopoint。

- 添加您从itemizedOverlay中的坐标获得的每个overlayitem(按照hello mapview的链接)。

- 在onPostExecute()方法在地图列表中添加该项目化覆盖图并使用mapview.refreshdrawablestate()。您可以使用onPostExecute与声明类似onPostExecute(虚空结果)

不要理解和对其做上述步骤!:)

+0

检查出我编辑的答案,并回复如果有任何查询.. :) –

+0

它只是关于我有意义!不过,我对一些事情有些困惑。你能否看看我在我的问题底部发布的新代码段,并告诉我我可能做错了什么/应该做什么?在doInBackground()方法的参数中为 – Mxyk

+0

给出该String [] []数组的任何名称,您可以稍后使用它获取地理点或坐标。 doInBackground()方法的参数中的 –

0

可能有很多原因,你看到一个强制关闭。你有没有尝试进入主要方法,看看它崩溃的地方?您可能会在传递null时导致崩溃的某些内容使用该参数。即你是否通过文件名在独立应用程序中使用?

这种类型的操作通常不会在一个活动内部完成,因为它会让您的应用程序的用户界面变得很疯狂。我会调查IntentService并从中调用您的代码。然后,您可以随时通过用户界面调用IntentService。

+0

我已添加我的logcat – Mxyk

0

你是从Source还是Jar文件使用它?如果您将它用作Jar文件,它可能会因为您的程序使用Android不可用的API而死亡。另一种选择可能是它触动了参数。我会尝试传递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中这样做的建议。即使我会考虑将所有代码分解为一个适当的方法,您可以直接调用并直接返回Array,因为ReadCSV.main()是一个void返回类型。所以它产生的必须是一个文件或一些东西,所以你可以得到这些数据。而不是只是它返回一个普通的数组。例如:

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

这就是你可以做的,以使自己更容易。

+0

我实际上改变了它的全部内容,现在返回一个数组,但是,我仍然收到了同样的错误,请给我一分钟来发布我的新代码 – Mxyk

+0

我不认为它是ReadCSV中的代码,这就是问题所在。从MapsActivity的外观来看。onCreate()方法第81行是问题所在。 MapsActivity不在您的ReadCSV类中,因此它不涉及,除非它返回null。 – chubbsondubs

+0

这是第81行:listOfOverlays2.add(mapOverlay2);在我尝试实现ReadCSV类之前,它工作正常。所以我仍然怀疑这是问题所在,除非您认为这是造成问题的原因。 – Mxyk