2016-05-28 2 views
0

Я начинаю программировать, и я просто хочу создать приложение, отображающее некоторые маркеры на карте, используя некоторые координаты из базы данных (размещенной на 000webhost), используя PHP и JSON. Карта работает, но маркеров нет. Пожалуйста, помогите мне, потому что я действительно не могу понять это.E/AndroidRuntime: FATAL EXCEPTION: AsyncTask # 1 java.lang.RuntimeException: Произошла ошибка во время выполнения doInBackground()

Это сообщение об ошибке я получаю:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
                Process: com.kid.compaq.licenta, PID: 24949 
                java.lang.RuntimeException: An error occured while executing doInBackground() 
                 at android.os.AsyncTask$3.done(AsyncTask.java:304) 
                 at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                 at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                 at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                 at java.lang.Thread.run(Thread.java:818) 
                Caused by: java.lang.IllegalStateException: Not on the main thread 
                 at maps.f.g.b(Unknown Source) 
                 at maps.z.D.a(Unknown Source) 
                 at maps.ag.t.a(Unknown Source) 
                 at uz.onTransact(:com.google.android.gms.DynamiteModulesB:167) 
                 at android.os.Binder.transact(Binder.java:385) 
                 at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source) 
                 at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source) 
                 at com.kid.compaq.licenta.MapsActivity$MarkerTask.doInBackground(MapsActivity.java:106) 
                 at com.kid.compaq.licenta.MapsActivity$MarkerTask.doInBackground(MapsActivity.java:62) 
                 at android.os.AsyncTask$2.call(AsyncTask.java:292) 
                 at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                 at java.lang.Thread.run(Thread.java:818)  
05-28 19:22:28.324 731-919/? E/InputDispatcher: channel 'd1579c5 com.kid.compaq.licenta/com.kid.compaq.licenta.MapsActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 
05-28 19:23:01.289 731-1342/? E/Sensors: handleToDriver handle(0) 
05-28 19:23:01.290 731-1342/? E/Sensors: handleToDriver handle(0) 
05-28 19:23:01.290 731-1342/? E/Sensors: new setDelay handle(0),ns(20000000)m, error(0), index(2) 
05-28 19:23:01.299 731-939/? E/WifiStateMachine: DisconnectedState (when=0 what=131143 arg1=10009 arg2=682) CMD_START_SCAN 10009 682 ic=0 proc(ms):0 dur:692 cnt=2252 rssi=-64 f=-1 sc=0 link=-1 tx=0,0, 0,0, 0,0 rx=0,0 fiv=20000 [on:0 tx:0 rx:0 period:121028] from screen [on:0 period:-131266637] 
05-28 19:23:01.299 731-939/? E/WifiStateMachine: ConnectModeState (when=-1ms what=131143 arg1=10009 arg2=682) CMD_START_SCAN 10009 682 ic=0 proc(ms):1 dur:692 cnt=2252 rssi=-64 f=-1 sc=0 link=-1 tx=0,0, 0,0, 0,0 rx=0,0 fiv=20000 [on:0 tx:0 rx:0 period:0] from screen [on:0 period:-131266637] 
05-28 19:23:01.300 731-939/? E/WifiStateMachine: DriverStartedState (when=-2ms what=131143 arg1=10009 arg2=682) CMD_START_SCAN 10009 682 ic=0 proc(ms):2 dur:692 cnt=2252 rssi=-64 f=-1 sc=0 link=-1 tx=0,0, 0,0, 0,0 rx=0,0 fiv=20000 [on:0 tx:0 rx:0 period:1] from screen [on:0 period:-131266636] 
05-28 19:23:01.300 731-939/? E/WifiStateMachine: stopReconnectWifi Wfd=false StopScan=false mDontReconnectAndScan=false 
05-28 19:23:01.302 731-939/? E/WifiStateMachine: [1.464.452.581.302 ms] noteScanStartWorkSource{10009} uid 10009 
05-28 19:23:01.304 731-10206/? E/WifiMonitor: handleEvent unknown: 15 CTRL-EVENT-SCAN-STARTED 
05-28 19:23:01.322 1716-1792/? E/CellLocation: create GsmCellLocation 
05-28 19:23:01.358 1716-1792/? E/CellLocation: create GsmCellLocation 
05-28 19:23:01.415 1716-25019/? E/MPlugin: Unsupported class: com.mediatek.common.telephony.IOnlyOwnerSimSupport 

MapsActivity:

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

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.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

    HttpURLConnection urlConnection= null; 
    private GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
     new MarkerTask().execute(); 
    } 


    /** 
    * Manipulates the map once available. 
    * This callback is triggered when the map is ready to be used. 
    * This is where we can add markers or lines, add listeners or move the camera. In this case, 
    * we just add a marker near Sydney, Australia. 
    * If Google Play services is not installed on the device, the user will be prompted to install 
    * it inside the SupportMapFragment. This method will only be triggered once the user has 
    * installed Google Play services and returned to the app. 
    */ 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     mMap.getUiSettings().isCompassEnabled(); 
     mMap.getUiSettings().setZoomControlsEnabled(true); 
     mMap.getUiSettings().setScrollGesturesEnabled(true); 
     mMap.getUiSettings().setMapToolbarEnabled(true); 


    } 

    class MarkerTask extends AsyncTask<Void, String, Void> { 



     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 

      InputStream is = null; 
      String result=""; 
      try { 
       URL url = new URL("http://catcat.netne.net/get_mark.php"); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.connect(); 
       is = urlConnection.getInputStream(); 
//2 sec, tel 
      } catch (Exception e) { 
       Log.e("URL connection", e.toString()); 
      } 
      try{ 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8")); 
       String line= null; 
       while((line= reader.readLine())!=null){ 
        result +=line; 
       } 
       is.close(); 
      } 
      catch (Exception e){ 
       e.printStackTrace(); 
      } 
      try{ 
       JSONArray jsonArray = new JSONArray(result); 
       for (int i = 0; i < jsonArray.length(); i++) { 
        JSONObject jsonObj = jsonArray.getJSONObject(i); 

        LatLng latLng = new LatLng(jsonObj.getJSONArray("latlng").getDouble(0), 
          jsonObj.getJSONArray("latlng").getDouble(1)); 


        // Create a marker for each station in the JSON data. 
        mMap.addMarker(new MarkerOptions() 
          .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)) 
          .title(jsonObj.getString("nume")) 
          .position(latLng)); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 


      return null; 

     } 
      // Executed after the complete execution of doInBackground() method 
      @Override 
      protected void onPostExecute (Void result){ 


      } 

    } 
} 

PHP файл:

<?php 



@$dbhandle = mysql_connect($host,$user,$pass)or die("Unable to connect to MySQL"); 

$selected = mysql_select_db($db,$dbhandle)or die("Could not select licenta"); 


    $sql="SELECT id_st, nume, CONCAT_WS(\",\",lat, lng) AS latlng FROM statii"; 
    $result = mysql_query($sql); 
    $response= array(); 
    while($row= mysql_fetch_assoc($result)){ 

     $response[]=array(
          'nume'   => $row['nume'], 
          'latlng'  => explode(',', $row['latlng']), 
          'id_st'   => $row['id_st'] 
          ); 
    } 

//$bd_json = json_encode($response); 
echo json_encode($response); 
exit(); 

?> 

Json ответ:

[{ 
    "nume": "Merge in sfarsit", 
    "latlng": ["45.659721", "25.606859"], 
    "id_st": "5" 
}, { 
    "nume": "Memo Cantina", 
    "latlng": ["45.655075", "25.581560"], 
    "id_st": "6" 
}] 
+0

Добавить маркер к карте на нити ui в 'onPostExecute' – Raghunandan

ответ

1

Один вопрос, который я вижу в том, что в коде ниже добавляемого маркер на карте Google (на UI потоке) от фонового потока:

// Create a marker for each station in the JSON data. 
       mMap.addMarker(new MarkerOptions() 
         .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)) 
         .title(jsonObj.getString("nume")) 
         .position(latLng)); 

Либо создать весь набор маркеров, построенный в петля первый, может быть в списке, а затем передать список в onPostExecute в конце, где бы вы добавить их на карту там, или после каждого маркера, используя onProgressUpdate метод, как:

// Create a marker for each station in the JSON data. 
mMarker = new MarkerOptions().icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)) 
         .title(jsonObj.getString("nume")) 
         .position(latLng); 
onProgressUpdate(mMarker); 

Убедитесь, что добавить :

MarkerOptions mMarker; 

ниже этой линии:

private GoogleMap mMap; 

И затем переопределить OnProgressUpdate метод:

protected void onProgressUpdate(MarkerOptions marker) { 
    mMap.addMarker(marker); 
} 

Не забудьте изменить

class MarkerTask extends AsyncTask<Void, String, Void> { 

в

class MarkerTask extends AsyncTask<Void, MarkerOptions, Void> { 

Хотя это может помочь вам преодолеть эту проблему, вам действительно стоит ознакомиться с классом AsyncTask и познакомиться с ней.

Удачи вам!

Смежные вопросы

 Смежные вопросы