2016-03-16 32 views
0

我試着去刮網站所拿到的緯度,經度使用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引用我的地圖在海上結束了。

我的網頁上有一個有效的緯度,它

這裏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頁面引用

+1

登錄LN和在onMapReady值LT。也記錄在線程中的值,你會知道最新情況或使用調試器 – Raghunandan

+0

http://stackoverflow.com/questions/18672456/java-lang-numberformatexception-invalid-double –

+1

@IntelliJ Amiya我已閱讀該帖子,甚至refernced類似的東西和給出的結果。沒有工作 – shaggs

回答

1

這應該是一個double值,而非字符串值,如empty"")字符串

Ansewer :如

實際上,上面2行代碼發生在你的onMapReady之後。所以當在MapReady執行時,你的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)); 
     } 
    } 
} 
+0

我沒有R.id.editText1 – shaggs

+0

糟糕。那麼你的代碼在哪裏 'String myString =((EditText)findViewById(R.id.editText1))。getText()。toString();' – thuongle

+0

我有該代碼作爲參考,並將其改爲'double lats;如果(lt!= null &&!lt.equals(「」))lats = Double.valueOf(lt); } else { lats = 0;我也是這樣做的,它讓我出海,所以猜測返回0,0 – shaggs

0

這只是引起並行過程中的「錯誤」的順序整理的時序問題。 (「錯」在相反你所期望的。)

onCreate()啓動異步操作調用getMapAsync()得到谷歌地圖。該操作將運行一段時間,一旦完成,將觸發onMapReady()方法。

onCreate()你也開始你自己的線程運行jsoup代碼來獲取網頁並從中提取座標。 jsoupconnect()get()方法運行一段時間後,他們完成你然後提取座標。

如果谷歌地圖代碼前面那麼jsoup代碼完成尚未取出並提取座標。

作爲谷歌地圖代碼具有更高的優先級(您首先需要地圖以便能夠在其上繪製標記),您應該先讓它完成。

然後在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()需要,因爲谷歌地圖是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(); 

    } 
}