마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

public void 에서 정해준 값을 가져오는 것이 안됩니다.

0 추천

제가 한글로 주소를 입력받아서, 그 주소를 위도,경도로 변환한뒤에, 그 위도,경도를 통해서 지도에 표시하고 싶습니다.

이 과정에서 주소를 위도,경도로 변환하는것 까지는 성공했습니다.

문제는 이 위도, 경도를 가져와 지도에 표시하는것인데요.

위도경도 값이 같은 class 안에 public void 안에 있긴 한데, 이 안에 있는 값을 가져오지 못하고 초기에 설정해 두었던 값을 가져오는 것이 문제입니다. 

클래스 아래에 이렇게 초기값을 주었습니다.

Double lon = 127.1763825;
Double lat = 37.0082453;

그리고 밑에 소스와 같이 위도 경도 값을 받아오도록 했습니다. Log에서도 위도경도값이 잘 나옵니다.

public void getGeoPoint(JSONObject jsonObject) {

        try {
            lon = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lng");

            lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lat");

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Log.d("myLog", "경도:" + lon); //위도/경도 결과 출력
        Log.d("myLog", "위도:" + lat);

    }

그리고 밑에 소스와 같이 lat, lon값을 가져오도록 하여 맵에 표시되도록 하였습니다.

loc = new LatLng(lat, lon); // 위치 좌표 설정
        Log.d("myLog", "loc : " + loc);
        CameraPosition cp = new CameraPosition.Builder().target((loc)).zoom(15).build();
        MarkerOptions marker = new MarkerOptions().position(loc); // 구글맵에 기본마커 표시
        mGoogleMap = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();// 화면에 구글맵 표시
        mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp)); // 지정위치로 이동
        mGoogleMap.addMarker(marker); // 지정위치에 마커 추가

위 처럼 했는데 Log에 뜨는 값이 안나오고 초기에 적었던 값이 나옵니다. 

loc를 적기 전에 getGeoPoint를 불러오는 걸 써야하는 걸까요?

제가 안드로이드, 자바 개발 초보라서 부족한 점이 많지만 조금만 도와주세요 ㅠㅠ

sean111 (1,220 포인트) 님이 2015년 9월 30일 질문

3개의 답변

0 추천
 
채택된 답변
아이고 온통 검정색인 코드 보느라 눈빠지네ㅠㅠ
아무튼 전체 소스 보니 알겠네요.

스레드 개념에 관련한 문제입니다.
코드를 보니 onCreate에서 위치 받아오는 코드를 별도의 태스크로 던져놓고 곧바로 map()을 호출하셨는데 바로 그점이 문제입니다.

태스크는 백그라운드애서 별도로 돌아가고 있고 아직 위치를 받아오지 못한 상태인데 그와 별개로 map()은 이미 실행되어 버리는 것이죠.

map()의 실행시점을 조율하면 해결되는 문제입니다.
위치를 최소한 한번 이상 받아온 뒤에 실행되게 하시던지 아니면 위치의 갱신과 표시를 따로따로 적절한 시점에 처리하시던지요.
Jinthree (8,980 포인트) 님이 2015년 10월 1일 답변
sean111님이 2015년 10월 6일 채택됨
감사합니다.
근데 어떻게 저 위치 값을 받아오게 할 수 있을까요?
제가 여러가지를 시도해봤는데 잘 안되네요...ㅠㅠ
가장 간단한 해결법은 map()을 getGeoPoint() 메소드의 끝자락에서 호출하는 겁니다.
아 됐습니다 감사합니다
정말 감사합니다 ㅠㅠ
0 추천
JSON 파싱중에 에러가 난게 아닌가 싶네요

JSONException이 나지 않았는지 확인해보세요
중견수 (5,600 포인트) 님이 2015년 9월 30일 답변
확인해본결과 JSONException은 나지 않는것 같습니다...ㅠ
0 추천
아래 소스에서 참조하는 lat lon이 클래스에서 참조히는게 맞는지 같은 이름의 지역 변수는 아닌지 확인해 봐야할거 같은데요.
그것도 이니라면 좀 더 넓은 범위로 소스를 봐야 겠네요.
Jinthree (8,980 포인트) 님이 2015년 10월 1일 답변
전체소스입니다.

package org.androidtown.lbs.map;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;


/**
 * 현재 위치의 지도를 보여주고 그 위에 오버레이를 추가하는 방법에 대해 알 수 있습니다.
 * 내 위치 표시를 해 줍니다.
 * 방향 센서를 이용해 나침반을 화면에 표시합니다.
 *
 * 구글맵 v2를 사용하기 위한 여러 가지 권한이 있어야 합니다.
 * 매니페스트 파일 안에 있는 키 값을 PC에 맞는 것으로 새로 발급받아서 넣어야 합니다.
 *
 * @author Mike
 */
public class MapActivity extends ActionBarActivity {


    GoogleMap mGoogleMap;
    AsyncTask<String, Void, Void> geoPointTask;

    String  mid, mname, memail, mphone, mcname, mcaddr, mcposition, mcurl;
    byte[] mncimg;
    ImageView imageView;
  //  String findAddress;
    Double lon = 127.1763825;
    Double lat = 37.0082453;
    LatLng loc;


    private class geoPointTask extends AsyncTask<String, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(String... params) {
            getGeoPoint(getLocationInfo(params[0].replace("\n", " ")
                    .replace(" ", "%20")));  //주소를 넘겨준다(공백이나 엔터는 제거합니다)
            Log.d("myLog", "params:" + params);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

        }
    }

    public static JSONObject getLocationInfo(String address) {
        HttpGet httpGet = new HttpGet(
                "http://maps.google.com/maps/api/geocode/json?address="
                        + address + "&ka&sensor=false");
        //해당 url을 인터넷창에 쳐보면 다양한 위도 경도 정보를 얻을수있다(크롬 으로실행하세요)
        HttpClient client = new DefaultHttpClient();
        HttpResponse response;
        StringBuilder stringBuilder = new StringBuilder();

        try {
            response = client.execute(httpGet);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (IOException ignored) {
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return jsonObject;
    }

    private void getGeoPoint(JSONObject jsonObject) {

        try {
            lon = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lng");

            lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lat");

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("receive", "에러!");
        }

        Log.d("myLog", "경도:" + lon); //위도/경도 결과 출력
        Log.d("myLog", "위도:" + lat);


    }

    public void map() {
        loc = new LatLng(lat, lon); // 위치 좌표 설정
        Log.d("myLog", "loc : " + loc);
        CameraPosition cp = new CameraPosition.Builder().target((loc)).zoom(15).build();
        MarkerOptions marker = new MarkerOptions().position(loc); // 구글맵에 기본마커 표시
        mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();// 화면에 구글맵 표시
        mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp)); // 지정위치로 이동
        mGoogleMap.addMarker(marker); // 지정위치에 마커 추가
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.d_listview);

        Intent intent = getIntent();
        mid = intent.getStringExtra("mid");
        mname = intent.getStringExtra("mname");
        memail = intent.getStringExtra("memail");
        mphone = intent.getStringExtra("mphone");
        mcname = intent.getStringExtra("mcname");
        mcaddr = intent.getStringExtra("mcaddr");
        mcposition = intent.getStringExtra("mcposition");
        mcurl = intent.getStringExtra("mcurl");
        mncimg = intent.getByteArrayExtra("mncimg");

        Bitmap bitmap = BitmapFactory.decodeByteArray(mncimg, 0, mncimg.length);

        imageView = (ImageView) findViewById(R.id.d_ncimage);
        imageView.setImageBitmap(bitmap);

        // TODO Auto-generated method stub

        String findAddress = mcaddr;
        geoPointTask = new geoPointTask().execute(findAddress);

        Log.d("myLog", "mcaddr:" + mcaddr);
        // LatLng loc = new LatLng(37.0082453, 127.1763825); // 위치 좌표 설정
        map();

    }

    public void mOnClick(View v){
        Intent i;
        Uri uri;

        switch ( v.getId() ) {

            case  R.id.btn_dial:
                uri = Uri.parse("tel:" + mphone);
                i = new Intent(Intent.ACTION_DIAL, uri);
                startActivity(i);
                break;

            case R.id.btn_sms:
                uri=Uri.parse("smsto:" + mphone);
                i= new Intent(Intent.ACTION_SENDTO,uri);
                i.putExtra("sms_body", "");
                startActivity(i);
                break;

            case R.id.btn_webpage:
                uri=Uri.parse("http://" + mcurl);
                i = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(i);
                break;

            case R.id.btn_email:
                uri=Uri.parse("mailto:" + memail);
                i= new Intent(Intent.ACTION_SENDTO, uri);
                startActivity(i);
                break;
        }
    }
}
...