2014-01-25 3 views
-2

Google지도를 이전에 내 앱에서 사용하도록했습니다. 이제 PHP 코드를 추가하여 PHP 서버에서 가져 왔고 현재 충돌이 발생하고 있습니다. 이유가 없습니다. JSON이 올바른지 확인했습니다. 그것이하는 일은 내 서버에 연락하여 위치 목록을 얻고지도에서 마커로 입력하는 것입니다. 비동기에서도이 작업을 시도했지만 검색 결과 백그라운드에서 UI를 변경할 수 없습니다.Android google지도가 충돌 함

MY MAP.JAVA

public class Map extends FragmentActivity implements OnInfoWindowClickListener 
{  
    private GoogleMap map; 
    private int zoomLevel = 10; 
    static JSONObject object =null; 

// flag for Internet connection status 
    Boolean isInternetPresent = false; 

    // Connection detector class 
    Connection cd; 

public boolean onCreateOptionsMenu(Menu menu) 
{ 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.mapnav, menu); 
     return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{  
    switch (item.getItemId()) 
    { 
    case R.id.action_add: 
     // Single menu item is selected do something 
     // Ex: launching new activity/screen or show alert message 
     Toast.makeText(this, "Add place is Selected", Toast.LENGTH_SHORT).show(); 
     Intent A = new Intent(this, Add.class); 
     startActivity(A); 
     return true; 

    case R.id.action_events: 
     // Single menu item is selected do something 
     // Ex: launching new activity/screen or show alert message 
     Toast.makeText(this, "Events is Selected", Toast.LENGTH_SHORT).show(); 
     Intent E = new Intent(this, Events.class); 
     startActivity(E); 
     return true; 

    case R.id.action_map: 
     Toast.makeText(this, "Map is Selected", Toast.LENGTH_SHORT).show(); 
     Intent M = new Intent(this, Map.class); 
     startActivity(M); 
     return true; 

    case R.id.action_chat: 
     Toast.makeText(this, "Chat is Selected", Toast.LENGTH_SHORT).show(); 
     Intent c = new Intent(this, Chat.class); 
     startActivity(c); 
     return true; 

    case R.id.action_settings: 
     Toast.makeText(this, "Settings is Selected", Toast.LENGTH_SHORT).show(); 
     return true; 

    default: 
     return super.onOptionsItemSelected(item); 
    } 
}  

    protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map_layout); 

    JsonParser jsonParser = new JsonParser(); 
    String json = jsonParser.getJSONFromUrl("http://www.mywebsite.com/test.json"); 

    if (json != null) 
    { 
     try 
     { 
      JSONObject parent = new JSONObject(json); 
      JSONArray eventDetails = parent.getJSONArray("maps"); 

      for(int i=0; i < eventDetails.length(); i++) 
      { 
       object = eventDetails.getJSONObject(i); 

       String getName = object.getString("name"); 
       String getAddy =object.getString("addy"); 
       String getHours = object.getString("hours"); 
       String getDesc = object.getString("desc"); 
       String getLat = object.getString("lat"); 
       String getLong = object.getString("long"); 

       Log.e("JSON", "> " + getName + getAddy + getHours + getDesc + getLat + getLong); 

       // creating connection detector class instance 
       cd = new Connection(getApplicationContext()); 

       try 
       { 
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

        Criteria criteria = new Criteria(); 

        // Get name of best provider 
        String provider = locationManager.getBestProvider(criteria, true); 

        map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) 
           .getMap(); 

        if (map!=null) 
        { 
         map.getUiSettings().setCompassEnabled(true); 
         map.setTrafficEnabled(true); 
         map.setMyLocationEnabled(true); 

         // My current location 
         Location myloc = locationManager.getLastKnownLocation(provider); 

         // Get latitude of current location 
         double latitude = myloc.getLatitude(); 
         // Get longitude of current location 
         double longitude = myloc.getLongitude(); 

         double lat = Double.valueOf(getLat); 
         double lng = Double.valueOf(getLong); 

         // create latlng 
         LatLng mylocation = new LatLng(latitude, longitude); 

         // Move the camera instantly to defaultLatLng. 
         map.moveCamera(CameraUpdateFactory.newLatLngZoom(mylocation, zoomLevel)); 

         LatLng location = new LatLng(lat, lng); 

         map.addMarker(new MarkerOptions().position(location) 
           .title(getName) 
           .snippet(getHours) 
           .icon(BitmapDescriptorFactory 
             .fromResource(R.drawable.icon))); 

         // map.setOnInfoWindowClickListener(this); 
        } 
       } 
       catch (NullPointerException e) 
       { 
        e.printStackTrace(); 
       } 
       } 
      } 
     catch (JSONException e) 
     { 
      // TODO Auto-generated catch block 
      Log.e("Json Error", "Error: " + e.toString()); 
       e.printStackTrace(); 
     } 
    } 
    } 

    @SuppressWarnings("deprecation") 
    public void showAlertDialog(Context context, String title, String message, Boolean status) { 
     AlertDialog alertDialog = new AlertDialog.Builder(context).create(); 

     // Setting Dialog Title 
     alertDialog.setTitle(title); 

     // Setting Dialog Message 
     alertDialog.setMessage(message); 

     // Setting alert dialog icon 
     alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail); 

     // Setting OK Button 
     alertDialog.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) 
      { 
       Intent intent = new Intent(getApplicationContext(), Navigation.class); 

       startActivity(intent); 
      } 
     }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

    @Override 
    public void onPause() 
    { 
       if (map != null) 
       { 
           map.setMyLocationEnabled(false); 
           map.setTrafficEnabled(false); 
       } 
       super.onPause(); 
    } 

    @Override 
    public void onInfoWindowClick(Marker marker) 
    { 
       Intent intent = new Intent(this, Map_layout.class); 
       intent.putExtra("snippet", marker.getSnippet()); 
       intent.putExtra("title", marker.getTitle()); 
       intent.putExtra("position", marker.getPosition()); 
       startActivity(intent); 
    } 

    private class PrefetchData extends AsyncTask<Void, Void, Void> 
    { 

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

     @Override 
     protected Void doInBackground(Void... arg0) 
     { 
      return null; 
     } 
     } 
} 

MY 로그 캣

01-25 18:46:36.142: E/AndroidRuntime(7482): FATAL EXCEPTION: main 
01-25 18:46:36.142: E/AndroidRuntime(7482): Process: com.databasedemo, PID: 7482 
01-25 18:46:36.142: E/AndroidRuntime(7482): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.databasedemo/com.databasedemo.Map}: android.os.NetworkOnMainThreadException 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.ActivityThread.access$800(ActivityThread.java:135) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.os.Handler.dispatchMessage(Handler.java:102) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.os.Looper.loop(Looper.java:136) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at java.lang.reflect.Method.invoke(Method.java:515) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at dalvik.system.NativeStart.main(Native Method) 
01-25 18:46:36.142: E/AndroidRuntime(7482): Caused by: android.os.NetworkOnMainThreadException 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnec tionOperator.java:137) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at com.databasedemo.JsonParser.getJSONFromUrl(JsonParser.java:35) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at com.databasedemo.Map.onCreate(Map.java:97) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.Activity.performCreate(Activity.java:5231) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
01-25 18:46:36.142: E/AndroidRuntime(7482):  ... 11 more 
백그라운드에서 실행 FOR // EDIT

... BACKGROUND

실행 FOR

public class Map extends FragmentActivity implements OnInfoWindowClickListener 
{  
    private GoogleMap map; 
    private int zoomLevel = 10; 
    static JSONObject object =null; 

// flag for Internet connection status 
    Boolean isInternetPresent = false; 

    // Connection detector class 
    Connection cd; 

public boolean onCreateOptionsMenu(Menu menu) 
{ 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.mapnav, menu); 
     return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{  
    switch (item.getItemId()) 
    { 
    case R.id.action_add: 
     // Single menu item is selected do something 
     // Ex: launching new activity/screen or show alert message 
     Toast.makeText(this, "Add place is Selected", Toast.LENGTH_SHORT).show(); 
     Intent A = new Intent(this, Add.class); 
     startActivity(A); 
     return true; 

    case R.id.action_events: 
     // Single menu item is selected do something 
     // Ex: launching new activity/screen or show alert message 
     Toast.makeText(this, "Events is Selected", Toast.LENGTH_SHORT).show(); 
     Intent E = new Intent(this, Events.class); 
     startActivity(E); 
     return true; 

    case R.id.action_map: 
     Toast.makeText(this, "Map is Selected", Toast.LENGTH_SHORT).show(); 
     Intent M = new Intent(this, Map.class); 
     startActivity(M); 
     return true; 

    case R.id.action_chat: 
     Toast.makeText(this, "Chat is Selected", Toast.LENGTH_SHORT).show(); 
     Intent c = new Intent(this, Chat.class); 
     startActivity(c); 
     return true; 

    case R.id.action_settings: 
     Toast.makeText(this, "Settings is Selected", Toast.LENGTH_SHORT).show(); 
     return true; 

    default: 
     return super.onOptionsItemSelected(item); 
    } 
}  

    protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map_layout); 
    new PrefetchData().execute(); 
    } 

    @SuppressWarnings("deprecation") 
    public void showAlertDialog(Context context, String title, String message, Boolean status) { 
     AlertDialog alertDialog = new AlertDialog.Builder(context).create(); 

     // Setting Dialog Title 
     alertDialog.setTitle(title); 

     // Setting Dialog Message 
     alertDialog.setMessage(message); 

     // Setting alert dialog icon 
     alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail); 

     // Setting OK Button 
     alertDialog.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) 
      { 
       Intent intent = new Intent(getApplicationContext(), Navigation.class); 

       startActivity(intent); 
      } 
     }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

    @Override 
    public void onPause() 
    { 
       if (map != null) 
       { 
           map.setMyLocationEnabled(false); 
           map.setTrafficEnabled(false); 
       } 
       super.onPause(); 
    } 

    @Override 
    public void onInfoWindowClick(Marker marker) 
    { 
       Intent intent = new Intent(this, Map_layout.class); 
       intent.putExtra("snippet", marker.getSnippet()); 
       intent.putExtra("title", marker.getTitle()); 
       intent.putExtra("position", marker.getPosition()); 
       startActivity(intent); 
    } 

    private class PrefetchData extends AsyncTask<Void, Void, Void> 
    { 

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

     @Override 
     protected Void doInBackground(Void... arg0) 
     { 
      JsonParser jsonParser = new JsonParser(); 
      String json = jsonParser.getJSONFromUrl("http://www.mywebsite.com/test.json"); 

      if (json != null) 
      { 
       try 
       { 
        JSONObject parent = new JSONObject(json); 
        JSONArray eventDetails = parent.getJSONArray("maps"); 

        for(int i=0; i < eventDetails.length(); i++) 
        { 
         object = eventDetails.getJSONObject(i); 

         String getName = object.getString("name"); 
         String getAddy =object.getString("addy"); 
         String getHours = object.getString("hours"); 
         String getDesc = object.getString("desc"); 
         String getLat = object.getString("lat"); 
         String getLong = object.getString("long"); 

         Log.e("JSON", "> " + getName + getAddy + getHours + getDesc + getLat + getLong); 

         // creating connection detector class instance 
         cd = new Connection(getApplicationContext()); 

         try 
         { 
          LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

          Criteria criteria = new Criteria(); 

          // Get name of best provider 
          String provider = locationManager.getBestProvider(criteria, true); 

          map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) 
             .getMap(); 

          if (map!=null) 
          { 
           map.getUiSettings().setCompassEnabled(true); 
           map.setTrafficEnabled(true); 
           map.setMyLocationEnabled(true); 

           // My current location 
           Location myloc = locationManager.getLastKnownLocation(provider); 

           // Get latitude of current location 
           double latitude = myloc.getLatitude(); 
           // Get longitude of current location 
           double longitude = myloc.getLongitude(); 

           double lat = Double.valueOf(getLat); 
           double lng = Double.valueOf(getLong); 

           // create latlng 
           LatLng mylocation = new LatLng(latitude, longitude); 

           // Move the camera instantly to defaultLatLng. 
           map.moveCamera(CameraUpdateFactory.newLatLngZoom(mylocation, zoomLevel)); 

           LatLng location = new LatLng(lat, lng); 

           map.addMarker(new MarkerOptions().position(location) 
             .title(getName) 
             .snippet(getHours) 
             .icon(BitmapDescriptorFactory 
               .fromResource(R.drawable.icon))); 

           // map.setOnInfoWindowClickListener(this); 
          } 
         } 
         catch (NullPointerException e) 
         { 
          e.printStackTrace(); 
         } 
         } 
        } 
       catch (JSONException e) 
       { 
        // TODO Auto-generated catch block 
        Log.e("Json Error", "Error: " + e.toString()); 
         e.printStackTrace(); 
       } 
      } 
      return null; 
     } 
     } 
} 

// LOG의 CAT

01-25 18:58:20.042: E/AndroidRuntime(7593): FATAL EXCEPTION: AsyncTask #1 
01-25 18:58:20.042: E/AndroidRuntime(7593): Process: com.databasedemo, PID: 7593 
01-25 18:58:20.042: E/AndroidRuntime(7593): java.lang.RuntimeException: An error occured while executing doInBackground() 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at java.lang.Thread.run(Thread.java:841) 
01-25 18:58:20.042: E/AndroidRuntime(7593): Caused by: java.lang.IllegalStateException: Not on the main thread 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at maps.aq.o.b(Unknown Source) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at maps.ak.g.b(Unknown Source) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at maps.af.al.k(Unknown Source) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at clz.onTransact(SourceFile:304) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at android.os.Binder.transact(Binder.java:361) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.getUiSettings(Unknown Source) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at com.google.android.gms.maps.GoogleMap.getUiSettings(Unknown Source) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at com.databasedemo.Map$PrefetchData.doInBackground(Map.java:198) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at com.databasedemo.Map$PrefetchData.doInBackground(Map.java:1) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
01-25 18:58:20.042: E/AndroidRuntime(7593):  ... 4 more 

답변

0

올바른 방법은 언급 한 AsyncTask를 사용하는 것입니다. AsyncTask에는 세 가지 주요 구성 요소가 있습니다. 두 개가 필요합니다. 세 번째 단계는 진행 과정입니다. 단 한 번의 네트워크 호출만으로는 필요한 것 같지 않습니다. 사용할 기기 2 개는 다음과 같습니다.

  • doInBackground - 네트워크 작업과 같이 시간이 오래 걸리는 작업이 여기에서 발생합니다. 일반적으로 여기에서 비트 맵이나 문자열 또는 어쩌면 완전히 다른 주제와 같은 주 스레드로 전달할 항목을 찾을 수 있습니다.
  • onPostExecute - 여기가 UI에 관한 내용입니다. Android는 하나의 스레드가 UI에 액세스하는 것을 허용하며 다른 모든 스레드는 UI 스레드에 물건을 전달하여 작업을 수행하거나 UI에서 작동해야합니다. onPostExecute는 항상 UI 스레드에서 실행됩니다.

당신이해야 할 일은 네트워크 연결이며 어떤 작업이 UI 작업인지 파악하고 작동시키기 위해 무엇이 필요합니까? Android API docs은이 작업을 수행하는 방법의 예를 보여줍니다.

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
0
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.databasedemo/com.databasedemo.Map}: android.os.NetworkOnMainThreadException 

UI 작업 Thread에서 네트워크 작업을 실행하고 있습니다. API 11 이후 UI Thread에서 장기 실행 작업을 더 이상 수행 할 수 없습니다. AsyncTask이 있지만 사용하고 있지 않습니다.

업데이트 된 질문에서 AsyncTask을 사용하고 있지만 Thread의 배경에서 UI 요소를 조작하려고합니다. UI를 업데이트하려면 AsyncTaskonPostExecute()을 사용해야합니다.

+0

하지만 AsyncTask의 배경에 놓으면 오류가 발생합니다. 내가 백그라운드에서 그것을 실행하고 로그 고양이를 게시 할 것입니다. – Jayce

+1

'AsyncTask'를 올바르게 구현하는 법을 배워야하기 때문입니다. – Emmanuel

+0

업데이트 된 답변을 확인하십시오. – Emmanuel

관련 문제