2016-08-22 2 views
0

온라인 mySQL 데이터베이스에서 정보를 실행하기 위해 AsyncTask를 사용하고 있습니다. 그런 다음 JSON 구문 분석을 사용하여 데이터베이스의 정보를 MapBox지도의 마커로 추가합니다. 현재 사용자가 새로운 마커 (코드에 washroom)를 업로드하면 정보를 데이터베이스에 업로드 한 다음 onPostExecute 메소드를 실행하고 MapsActivity.java으로 돌아갑니다. MapsActivity.java은지도를 새로 고침하고 새로 추가 된 마커를 표시해야하지만 그렇지 않습니다. 새로운 마커를 추가하기 전에 추가 된 마커 만 표시합니다. 앱을 닫고 열면 마커가 업데이트되어 새로운 마커를 표시합니다! 어떤 도움을 주시면 감사하겠습니다! 더 이상 내 코드의 필요가 있다면, 좀 더 보여 드리겠습니다onPostExecute가 올바르게 활동을 시작하지 않습니다.

class BackgroundTask extends AsyncTask<String, Void, String> { 
Context ctx; 
public static boolean WASHROOMS_LOADED; 
private String JSON_STRING; 
private String json_string; 

BackgroundTask(Context ctx) { 
    this.ctx = ctx.getApplicationContext(); 


} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
} 
String add_url = "http://appart-software.com/add_washroom.php"; 
String get_url = "http://appart-software.com/get_washroom.php"; 
@Override 
protected String doInBackground(String... params) { 
    String method = params[0]; 
    if (method.equals("addWashroom")) { 

     String location = params[1]; 
     String name = params[2]; 
     String price = params[3]; 

     try { 
      URL url = new URL(add_url); 
      HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(); 
      httpUrlConnection.setRequestMethod("POST"); 
      httpUrlConnection.setDoOutput(true); 
      OutputStream outputStream = httpUrlConnection.getOutputStream(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8")); 
      String data_string = URLEncoder.encode("WClocation","UTF-8")+"="+URLEncoder.encode(location,"UTF-8")+"&"+ 
        URLEncoder.encode("WCname","UTF-8")+"="+URLEncoder.encode(name,"UTF-8")+"&"+ 
        URLEncoder.encode("WCprice","UTF-8")+"="+URLEncoder.encode(price,"UTF-8"); 
      bufferedWriter.write(data_string); 
      bufferedWriter.flush(); 
      bufferedWriter.close(); 
      outputStream.close(); 
      InputStream inputStream = httpUrlConnection.getInputStream(); 
      inputStream.close(); 
      httpUrlConnection.disconnect(); 
      return "Washroom Added!"; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     //You want to get washroom info 
    } else if (method.equals("getWashroom")){ 

     try { 

      URL url = new URL(get_url); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
      InputStream inputStream = httpURLConnection.getInputStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1")); 
      StringBuilder stringBuilder = new StringBuilder(); 
      while ((JSON_STRING = bufferedReader.readLine())!=null) { 

       stringBuilder.append(JSON_STRING+"\n"); 
      } 

      bufferedReader.close(); 
      inputStream.close(); 
      httpURLConnection.disconnect(); 
      //Return JSON formatted info 
      return stringBuilder.toString().trim(); 


     } catch (MalformedURLException e){ 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


    } 

    return null; 
} 

@Override 
protected void onProgressUpdate(Void... values) { 
    super.onProgressUpdate(values); 
} 

@Override 
protected void onPostExecute(String result) { 

    if (result.equals("Washroom Added!")) { 

     Toast.makeText(ctx,result,Toast.LENGTH_LONG).show(); 

     WASHROOMS_LOADED = false; 


    } else { 

     //setting result as a movable string 
     json_string = result; 

     //intent and sending JSON data 
     Intent intent = new Intent(ctx,MapsActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.putExtra("json_data",json_string); 
     ctx.startActivity(intent); 

     WASHROOMS_LOADED = true; 


    } 
} 
} 

MapsActivity.java의

public class MapsActivity extends FragmentActivity { 


private MapView mapView; 
private MapboxMap map; 
private ImageButton locationToggle; 
private LocationServices locationServices; 
private String json_string; 
private JSONObject jsonObject; 
private JSONArray jsonArray; 

public static String WASHROOMINFO; 

public static String CURRENT_LOCATION; 

private static final int PERMISSIONS_LOCATION = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MapboxAccountManager.start(this, getString(R.string.accessToken)); 
    setContentView(R.layout.activity_maps); 


    //getting location services 
    locationServices = com.mapbox.mapboxsdk.location.LocationServices.getLocationServices(MapsActivity.this); 

    //onClick to go to add washroom activity 
    findViewById(R.id.addWashroom).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      if (CURRENT_LOCATION != null) { 

       Intent intent = new Intent(getBaseContext(), AddWashroom.class); 
       startActivity(intent); 

      } else { 

       Toast.makeText(getBaseContext(),"You Must Turn on User Location Before Adding a Washroom!",Toast.LENGTH_LONG).show(); 

      } 

     } 
    }); 

    //washrooms have not been loaded in yet 
    if (!BackgroundTask.WASHROOMS_LOADED) { 
     //getting database info 
     String method = "getWashroom"; 
     BackgroundTask backgroundTask = new BackgroundTask(getBaseContext()); 
     backgroundTask.execute(method); 
     finish(); 

    } 

    mapView = (MapView) findViewById(R.id.mapview); 
    mapView.onCreate(savedInstanceState); 
    mapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(MapboxMap mapboxMap) { 
      //when map is ready assign mapboxMap variable 
      map = mapboxMap; 

      //Washroom loading has been requested and JSON data is ready 
      if (BackgroundTask.WASHROOMS_LOADED) { 

       //Getting JSON data from intent 
       json_string = getIntent().getExtras().getString("json_data"); 
       try { 
        //new JSON object from JSON data 
       jsonObject = new JSONObject(json_string); 
        //gets JSON array from JSON object 
        jsonArray = jsonObject.getJSONArray("server_response"); 

        //Marker list for buffering markers 
        List<Marker> markers = new ArrayList<Marker>(); 

        //do this for all markers! 
        for (int i = 0; i < jsonArray.length(); i++) { 
         //Single JSON object of single marker 
         JSONObject JO = jsonArray.getJSONObject(i); 

         //Dividing location field into lat & lng 
         String latlng = JO.getString("location"); 
         String[] latlngSplit = latlng.split(" , ",2); 
         double lat = Double.valueOf(latlngSplit[0]); 
         double lng = Double.valueOf(latlngSplit[1]); 


         //adding marker 
         Marker marker = map.addMarker(new MarkerOptions() 
         .title(JO.getString("name")) 
           .setSnippet(JO.getString("price")) 
           .position(new LatLng(lat,lng)) 
         ); 

         //add marker to markers list. 
         markers.add(marker); 

        } 

        BackgroundTask.WASHROOMS_LOADED = false; 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 

     } 
    }); 

    locationToggle = (ImageButton) findViewById(R.id.location_toggle); 
    locationToggle.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (map != null) { 
       //toggle GPS when clicking show location button 
       toggleGps(!map.isMyLocationEnabled()); 
      } 
     } 
    }); 

} 

BackgroundTask (AsyncTask를).

+0

'onNewIntent'를 무시하십시오. 그렇지 않으면 인 텐트 데이터가 업데이트되지 않습니다. – TWL

+0

'startActivity()'에서'intent'는 기본적으로'MapActivity'의 새로운 인스턴스를 생성합니다. 따라서이 결과를 얻고 있습니다. 이 두 클래스를'인터페이스 '로 만들고 그것을 사용하여 상호 작용할 수있다. – Shaishav

답변

0

onCreate() 메서드에서 데이터베이스 정보를 가져 오기 때문에 응용 프로그램을 다시 열 때 새로운 아이콘이 표시됩니다.이 아이콘은 활동이 시작될 때만 트리거됩니다. 위치가 변경 될 때 데이터베이스 정보를 가져 오거나 onNewIntent 메소드를 무시하십시오. onNewIntent을 우선 적용하려면 먼저 launchmode의 활동을 singleTop에 명시해야합니다.

관련 문제