안드로이드 다음 맵 API 사용하는 데 네트워크 연결이 안될 시 어떻게 처리해야 하나요?
조회수 3395회
안드로이드를 공부하는 학생입니다.
다음 맵 api를 사용하여 판교역 주변 카페를 보여주는 예제를 하고 있습니다.
와이파이나 LTE가 잡힐 때 는 잘 작동합니다.
하지만 네트워크가 안 잡힌 상황이나 네트워크를 끈 상황에서 어플을 실행하면 종료되었다는 메세지와 함께 강제 종료됩니다.
네트워크가 안될 시에 다른 액티비티를 보여주거나 하고 싶은 데 어떻게 해야하나요? 예를 들어 크롬으로 인터넷 할 때 네트워크 연결이 안될 시에도 어플이 꺼지는 게 아니라 네트워크 확인하라는 화면을 보여주는 것처럼 말입니다.
코드는 다음과 같습니다.
public class TabFragment3 extends Fragment implements MapView.MapViewEventListener {
private static final String LOG_TAG = "SearchDemoActivity";
private MapView mMapView;
private HashMap<Integer, Item> mTagItemMap = new HashMap<Integer, Item>();
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.tab_fragment_3, container, false);
mMapView = (MapView)rootView.findViewById(R.id.map_view);
mMapView.setDaumMapApiKey(MapApiConst.DAUM_MAPS_ANDROID_APP_API_KEY);
mMapView.setMapViewEventListener(this);
// mMapView.setCalloutBalloonAdapter(new CustomCalloutBalloonAdapter());
return rootView;
}
/* class CustomCalloutBalloonAdapter implements CalloutBalloonAdapter {
private final View mCalloutBalloon;
public CustomCalloutBalloonAdapter() {
mCalloutBalloon = getLayoutInflater().inflate(R.layout.custom_callout_balloon, null);
}
@Override
public View getCalloutBalloon(MapPOIItem poiItem) {
if (poiItem == null) return null;
Item item = mTagItemMap.get(poiItem.getTag());
if (item == null) return null;
ImageView imageViewBadge = (ImageView) mCalloutBalloon.findViewById(R.id.badge);
TextView textViewTitle = (TextView) mCalloutBalloon.findViewById(R.id.title);
textViewTitle.setText(item.title);
TextView textViewDesc = (TextView) mCalloutBalloon.findViewById(R.id.desc);
textViewDesc.setText(item.address);
imageViewBadge.setImageDrawable(createDrawableFromUrl(item.imageUrl));
return mCalloutBalloon;
}
@Override
public View getPressedCalloutBalloon(MapPOIItem poiItem) {
return null;
}
}*/
public void onMapViewInitialized(MapView mapView) {
Log.i(LOG_TAG, "MapView had loaded. Now, MapView APIs could be called safely");
mMapView.setMapCenterPointAndZoomLevel(MapPoint.mapPointWithGeoCoord(37.452288655557076, 127.13049478628298), 2, true);
Searcher searcher = new Searcher();
String query = "판교역 카페";
double latitude = 37.452288655557076;
double longitude = 127.13049478628298;
int radius = 2500; // 중심 좌표부터의 반경거리. 특정 지역을 중심으로 검색하려고 할 경우 사용. meter 단위 (0 ~ 10000)
int page = 1;
String apikey = MapApiConst.DAUM_MAPS_ANDROID_APP_API_KEY;
searcher.searchKeyword(getActivity().getApplicationContext(), query, latitude, longitude, radius, page, apikey, new OnFinishSearchListener() {
@Override
public void onSuccess(final List<Item> itemList) {
showResult(itemList);
}
@Override
public void onFail() {
showToast("API_KEY의 제한 트래픽이 초과되었습니다.");
}
});
}
private void showToast(final String text) {
Toast.makeText(getActivity().getApplicationContext(), text, Toast.LENGTH_SHORT).show();
}
private void showResult(List<Item> itemList) {
MapPointBounds mapPointBounds = new MapPointBounds();
for (int i = 0; i < itemList.size(); i++) {
Item item = itemList.get(i);
MapPOIItem poiItem = new MapPOIItem();
poiItem.setItemName(item.title);
poiItem.setTag(i);
MapPoint mapPoint = MapPoint.mapPointWithGeoCoord(item.latitude, item.longitude);
poiItem.setMapPoint(mapPoint);
mapPointBounds.add(mapPoint);
poiItem.setMarkerType(MapPOIItem.MarkerType.CustomImage);
poiItem.setCustomImageResourceId(R.drawable.map_pin_blue);
poiItem.setSelectedMarkerType(MapPOIItem.MarkerType.CustomImage);
poiItem.setCustomSelectedImageResourceId(R.drawable.map_pin_red);
poiItem.setCustomImageAutoscale(false);
poiItem.setCustomImageAnchor(0.5f,1.0f);
mMapView.addPOIItem(poiItem);
mTagItemMap.put(poiItem.getTag(), item);
}
mMapView.moveCamera(CameraUpdateFactory.newMapPointBounds(mapPointBounds));
MapPOIItem[] poiItems = mMapView.getPOIItems();
if (poiItems.length > 0) {
mMapView.selectPOIItem(poiItems[0], false);
}
}
private Drawable createDrawableFromUrl(String url) {
try {
InputStream is = (InputStream) this.fetch(url);
Drawable d = Drawable.createFromStream(is, "src");
return d;
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private Object fetch(String address) throws MalformedURLException,IOException {
URL url = new URL(address);
Object content = url.getContent();
return content;
}
@Override
public void onMapViewCenterPointMoved(MapView mapView, MapPoint mapCenterPoint) {
}
@Override
public void onMapViewDoubleTapped(MapView mapView, MapPoint mapPoint) {
}
@Override
public void onMapViewLongPressed(MapView mapView, MapPoint mapPoint) {
}
@Override
public void onMapViewSingleTapped(MapView mapView, MapPoint mapPoint) {
}
@Override
public void onMapViewDragStarted(MapView mapView, MapPoint mapPoint) {
}
@Override
public void onMapViewDragEnded(MapView mapView, MapPoint mapPoint) {
}
@Override
public void onMapViewMoveFinished(MapView mapView, MapPoint mapPoint) {
}
@Override
public void onMapViewZoomLevelChanged(MapView mapView, int zoomLevel) {
}
}
에러는 다음과 같습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
서버로 API를 호출하는 부분에서(fetchData 함수) 다음과 같이 UnknownHostException을 처리해주면 됩니다. 설명을 위한 간단한 샘플이니 참고만 해주세요.
try { URL url = new URL("https://httpbin.org/get"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.getResponseCode(); } catch (UnknownHostException e) { runOnUiThread(new Runnable() { @Override public void run() { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("네트워크 에러"); builder.setMessage("네트워크 연결을 확인하세요."); builder.create().show(); } }); } catch (IOException e) { ... }
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력