获取 Android Activity 来运行非 Activity 代码

发布于 2024-11-26 12:42:43 字数 8654 浏览 0 评论 0原文

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

所以,我所做的就是将这个类添加到我的 Android App 程序中。我希望应用程序在某个时刻调用类的方法来生成数组、返回它,并使用这个新数组在地图上绘制点。至于抓取数组并精确定位它们的纬度和经度,我可以做到。

但是,当在我的 Android 应用程序的主类中,我声明: 时

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

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

有人认为他们明白我的问题是什么吗?也许有替代解决方案?

LogCat如下图所示:

07-27 15:19:25.105: 错误/AndroidRuntime(12214): 致命异常: main 07-27 15:19:25.105:错误/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:错误/AndroidRuntime(12214):在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:错误/AndroidRuntime(12214):在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(本机方法) 07-27 15:19:25.105:错误/AndroidRuntime(12214):在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:错误/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):在net.learn2develop.GoogleMaps.MapsActivity.onCreate(MapsActivity.java:86) 07-27 15:19:25.105:错误/AndroidRuntime(12214):在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;
}
}

编辑:对于Ravi Bhatt

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();

}

}

I have an android app that basically just plots points on a map.
These maps are determined from a totally different class.
I originally wrote this class as its own program (it reads a CSV file and picks out points and gives back their longitude and latitude in an array).

So, what I have done is added this class to my Android App program. I want the app at some point to call up the class's method that will generate the array, return it, and use this new array to plot points on the map. As far as grabbing the array and pinpointing each of their latitudes and longitudes goes, I can do it.

However, when in my Android App's main class, I state:

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

, my program will force close. (ReadCsv is the name of the class I put in the program - getArray in the only method in the class, and it returns an array[][]).

Does anyone think they see what my problem here is? Maybe an alternative solution is possible?

The LogCat is shown below:

07-27 15:19:25.105: ERROR/AndroidRuntime(12214): FATAL EXCEPTION: main
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.learn2develop.GoogleMaps/net.learn2develop.GoogleMaps.MapsActivity}: java.lang.NullPointerException
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): at 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: ERROR/AndroidRuntime(12214): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): at 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: ERROR/AndroidRuntime(12214): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): at 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: ERROR/AndroidRuntime(12214): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): at dalvik.system.NativeStart.main(Native Method)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): Caused by: 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): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-27 15:19:25.105: ERROR/AndroidRuntime(12214): ... 11 more

And my code is:

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;
}
}

EDIT: For Ravi Bhatt

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();

}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

四叶草在未来唯美盛开 2024-12-03 12:42:43

最适合您需求的想法是 AsyncTask。
使用此链接 http://developer.android.com/reference/android/os/ AsyncTask.html

您可以在 doInBackground() 方法中传递参数。 params 可以是纬度和经度列表。

-- 进行地理定位

-- 创建覆盖项

-- 将其添加到逐项覆盖

onPostExectute() 方法中,执行以下操作。

-- 将其添加到mapoverlay即覆盖列表中。
-- 之后您可以使用refreshdrawablestate()方法。

为了从非活动类中放置该叠加层,您可以使用mapactivity的引用或上下文并使用它来添加叠加层。

编辑:

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

使用 AsncTask 时,由于您有坐标数组,因此请在 AsyncTask 中将此数组作为参数传递,例如异步任务。

然后 doInBackGround() 方法使用 doInBackGroud String[][]...varName > 因为您有字符串数组。将用于导出坐标和地理点的 for 循环逻辑放入 doInBackGround 方法中。

--添加您从 itemizedOverlay 中的坐标获得的每个覆盖项目(根据 hello mapview 的链接)。

--在onPostExecute()方法中,在地图列表中添加逐项叠加并使用mapview.refreshdrawablestate()。您可以将 onPostExecute 与诸如 onPostExecute(Void result) 之类的声明一起使用,

理解并完成上述步骤! :)

The best think for your needs is AsyncTask.
use this link http://developer.android.com/reference/android/os/AsyncTask.html

you can pass params in doInBackground() methods. params can be the list of latitude and longitude.

-- make geopoing

-- create overlayitem

-- add it in itemized overlay

onPostExectute() method do following.

-- add it in to mapoverlay i.e. list of overlay.
-- you can use refreshdrawablestate() method after that.

for putting that overlay from non activity class you can use mapactivity's reference or context and use it for adding the overlay.

EDIT :

for example, consider the example mapview from the link http://developer.android.com/resources/tutorials/views/hello-mapview.html

When using AsncTask, as you have array of coordinates, pass this array in AsyncTask as params like AsyncTask.

then doInBackGround() method use doInBackGroud < String[][]...varName > as you have string array. Put that for loop logic to derive coordinates and Geopoint in doInBackGround Method.

--add each of the overlayitem which u get from coordinate in itemizedOverlay (as per link of hello mapview).

--In onPostExecute() method add that itemized overlay in the List of the map and use mapview.refreshdrawablestate(). you can use onPostExecute with declaration like onPostExecute(Void result)

Do the above step with understanding and its DONE!!! :)

紧拥背影 2024-12-03 12:42:43

您看到部队关闭的原因可能有很多。您是否尝试过进入 main 方法并查看它在哪里崩溃?当您传递 null 时,您可能会使用该参数来导致崩溃。即您是否传递了要在独立应用程序中使用的文件名?

这种类型的操作通常不在 Activity 内完成,因为它会使应用程序的 UI 变得卡顿。我会调查 IntentService 并从中调用您的代码。然后,您可以随时从 UI 调用 IntentService。

There could be many reasons you are seeing a force close. Have you tried stepping into the main method and seeing where it crashes? You might be using the parameter for something that is causing the crash when you pass null. ie were you passing the filename to use in your stand alone app?

This type of operation is typically not done inside an activity since it would make your app's UI janky. I would investigate IntentService and call your code from it. You can then invoke the IntentService whenever you want from your UI.

总以为 2024-12-03 12:42:43

您是从源文件还是 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 中执行此操作的建议。即使我会考虑将所有代码分解为一个正确的方法,您可以直接调用并直接返回数组,因为 ReadCSV.main() 是 void 返回类型。因此它生成的必须是一个文件或其他东西,以便您可以获得该数据。而不是让它返回一个普通数组。比如:

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

这就是你可以做的,让这件事对你自己来说更容易。

Are you using it from Source or a Jar file? If you're using it as a Jar file it could be dying because your program uses an API not available to Android. The other option might be it touches the args. I'd try passing ReadCSV.main(new String[] {}).

I see a java.lang.NullPointerException, but looking through the logcat is hard because of formatting. But Something inside ReadCSV is throwing a NPE. I'd suggest step through ReadCSV with a debugger, or find the line number of the line that's tossing that NPE. Actually found it:

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

So on line 81 in MapsActivity is the problem. It doesn't look like ReadCSV.main() is being reached yet.

I would also follow the suggestion of doing this inside a AsyncTask. Even I'd consider factoring out all of your code into a proper method that you can directly invoke and return the Array directly because ReadCSV.main() is a void return type. So what it produces must be a file or something so you can get that data. Instead of that just have it return a plain array. Something like:

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

That's what you could do to make this easier on yourself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文