【问题标题】:Invalid double: "" when getting lat lng获取 lat lng 时无效的双精度:“”
【发布时间】:2016-07-02 08:53:24
【问题描述】:

我试图抓取一个网站来获取 lat,lng 使用 Jsoup 放入 gmaps 但我得到了一个堆栈跟踪

FATAL EXCEPTION: main
Process: au.com.industryresponsetraining.map, PID: 18842
 java.lang.NumberFormatException: Invalid double: ""

因为

您正在解析 onCreate() 值而没有放置任何默认值,因此异常

除了我的 onCreate() 是我的 Jsoup 运行的地方。 如果我添加类似

double myDouble;

String myString = ((EditText) findViewById(R.id.editText1)).getText().toString();

if (myString != null && !myString.equals("")) {
    myDouble = Double.valueOf(myString);
} else {
    myDouble = 0;
}

引用自 here 我的地图在海上结束。

我的网页上有一个有效的 lat,lng

这是我的活动

package au.com.industryresponsetraining.map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;


public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    String ln = "";
    String lt = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {

                    //get the Document object from the site. Enter the link of site you want to fetch
                    Document document = Jsoup.connect("http://www.industryresponsetraining.com.au/mdt/lat.html").get();

                    //Get the title of blog using title tag
                    //title = document.select("p").text().toString();
                    lt = document.select("h6").text().toString();
                    ln = document.select("h7").text().toString();


                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        double lats = Double.valueOf(lt);
        double lngs = Double.valueOf(ln);
        LatLng marker = new LatLng(lats, lngs);
        mMap.addMarker(new MarkerOptions().position(marker).title("my Marker"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(marker));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 15));
    }
}

实际的谷歌地图资料已参考developers页面

【问题讨论】:

  • 在onMapReady中记录ln和lt的值。还要记录线程中的值,您将知道发生了什么或使用调试器
  • @IntelliJ Amiya 我已经阅读了那篇文章,甚至提到了类似的东西并给出了结果。没用
  • @Raghunandan 我会把它记录为lt = document.select("h6").text().toString(); 并从上面删除它吗?

标签: android google-maps android-studio google-maps-api-3


【解决方案1】:

它应该是 double 值,而不是像 empty ("") String 这样的字符串值

答案:如

中所述

实际上,上面的 2 行代码发生在您的 onMapReady 之后。所以当 onMapReady 执行时,你的 lt 和 ln 总是“”。因此,您需要确定您的 lt 和 'ln 何时更新为新值,然后在此之前创建一个市场。

编辑工作代码

package au.com.industryresponsetraining.map;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;


public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private static final String TAG = MapsActivity.class.getSimpleName();
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        new ParseAsyncTask().execute("http://www.industryresponsetraining.com.au/mdt/lat.html");
    }

    class ParseAsyncTask extends AsyncTask<String, Void, String[]> {

        @Override
        protected String[] doInBackground(String... params) {
            String url = params[0];
            try {

                //get the Document object from the site. Enter the link of site you want to fetch
                Document document = Jsoup.connect(url).get();

                //Get the title of blog using title tag
                //title = document.select("p").text().toString();
                String lat = document.select("h6").text().toString();
                Log.d(TAG, lat);

                String lng = document.select("h7").text().toString();
                Log.d(TAG, lng);
                return new String[]{lat, lng};
            } catch (IOException e) {
                e.printStackTrace();
                return new String[]{"0.0", "0.0"};
            }
        }

        @Override
        protected void onPostExecute(String[] result) {
            createMarker(result);
        }
    }

    private void createMarker(String[] result) {
        if (mMap != null) {
            double lats = Double.valueOf(result[0]);
            double lngs = Double.valueOf(result[1]);
            LatLng marker = new LatLng(lats, lngs);
            mMap.addMarker(new MarkerOptions().position(marker).title("my Marker"));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(marker));
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 15));
        }
    }
}

【讨论】:

  • 糟糕。那么你的代码在哪里String myString = ((EditText) findViewById(R.id.editText1)).getText().toString();
  • 我将该代码作为参考并将其更改为 double lats; if (lt != null &amp;&amp; !lt.equals("")) { lats = Double.valueOf(lt); } else { lats = 0; } 我也为 lngs 执行此操作,它使我远离大海,所以猜测返回 0, 0
  • 所以你的代码 lt = document.select("h6").text().toString(); ln = document.select("h7").text().toString(); 永远不会在运行时发生。
  • 这就是我的猜测。
  • 实际上,上面的 2 行代码发生在您的 onMapReady 之后。所以当onMapReady 执行时,你的ltln 总是""。因此,您需要确定您的lt 和'ln 何时更新为新值,然后在此之前创建市场。
【解决方案2】:

这只是并行进程以“错误”顺序完成导致的时间问题。 (“错误”与您的预期相反。)

onCreate() 中,您通过调用getMapAsync() 启动异步操作以获取Google 地图。该操作将运行一段时间,一旦完成,onMapReady() 方法就会被触发。

onCreate() 中,您还启动了自己的线程,该线程运行jsoup 代码来获取网页并从中提取坐标。 jsoupconnect()get() 方法会运行一段时间,然后在它们完成后提取坐标。

如果 Google Map 代码较早完成,则 jsoup 代码尚未获取并提取坐标。

由于 Google 地图 代码具有更高的优先级(您首先需要地图才能在其上绘制标记),您应该让它先完成。

然后在onMapReady() 方法中,您可以启动您的jsoup 代码。

最小的代码修改可能是这样的:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    String ln = "";
    String lt = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {

                    //get the Document object from the site. Enter the link of site you want to fetch
                    Document document = Jsoup.connect("http://www.industryresponsetraining.com.au/mdt/lat.html").get();

                    //Get the title of blog using title tag
                    //title = document.select("p").text().toString();
                    lt = document.select("h6").text().toString();
                    ln = document.select("h7").text().toString();

                    // The UI must be modified from the UI thread.
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            double lats = Double.valueOf(lt);
                            double lngs = Double.valueOf(ln);
                            LatLng marker = new LatLng(lats, lngs);
                            mMap.addMarker(new MarkerOptions().position(marker).title("my Marker"));
                            mMap.moveCamera(CameraUpdateFactory.newLatLng(marker));
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 15));
                        }
                    });

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

runOnUiThread() 是必需的,因为 Google 地图 是 UI 的一部分,并且无法从后台线程修改 UI。

但是(上图)并不是真正适合的 Android 方式。而不是仅仅为 jsoup 代码创建一个标准的 Java 线程,然后在该线程中使用 runOnUiThread(),您应该像这样使用 AsyncTask

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    String ln = "";
    String lt = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        AsyncTask jsoupTask = new AsyncTask() {

            @Override
            protected Object doInBackground(Object[] params) {
                // This runs in a background thread.

                Document document;

                try {
                    //get the Document object from the site. Enter the link of site you want to fetch
                    document = Jsoup.connect("http://www.industryresponsetraining.com.au/mdt/lat.html").get();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return document; // Might be null!
            }

            @Override
            protected void onPostExecute(Document document) {
                // This is triggered once the code in doInBackground() has been completed.

                super.onPostExecute(document);

                if (document != null) {
                    try {
                        //Get the title of blog using title tag
                        //title = document.select("p").text().toString();
                        lt = document.select("h6").text().toString();
                        ln = document.select("h7").text().toString();

                        double lats = Double.valueOf(lt);
                        double lngs = Double.valueOf(ln);
                        LatLng marker = new LatLng(lats, lngs);
                        mMap.addMarker(new MarkerOptions().position(marker).title("my Marker"));
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(marker));
                        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 15));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        };

        jsoupTask.execute();

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2015-12-14
    • 1970-01-01
    • 2016-05-10
    • 2022-01-02
    相关资源
    最近更新 更多