Android 앱 개발시 Java 7 사용하기

GDG Korea Android 의 공동 운영자이신 김기완(hl5pma 골뱅이 gmail.com) 님께서 
안드로이드의 새로운 빌드시스템인 gradle 설정을 통해, 작년 가을 새롭게 릴리즈된 Java 7 

컴파일러를 이용하여 안드로이드 어플리케이션을 개발하는 방법에 관한 내용을 정리해 주셨습니다.
개발자의 삶을 한층 더 편안하게 만들어줄 수 있는 Java 의 새로운 기능들을 함께 살펴보면 어떨까요?

buildToolsVersion 19 부터 Java 7 로 앱을 빌드할 수 있게 됨에 따라 gradle 빌드 스크립트에 아래 내용을 추가해주면 Java 7 의 특성들을 이용하여 앱을 개발할 수 있게 되었습니다.

android {
  compileSdkVersion 19
  buildToolsVersion "19.0.0"

  defaultConfig {
    minSdkVersion 7
    targetSdkVersion 19
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
}
안드로이드앱 개발시 이용할 수 있는 Java 7 의 특징들은 다음과 같습니다.

이진수 표현

숫자 앞에 "0b" 또는 "0B" 를 붙여 이진수 표현이 가능합니다.
int hex = 0x8;  // 16진수
int dec = 8;  // 10진수
int oct = 08; // 8진수
int bin = 0b101010; // 2진수

숫자 사이에 언더스코어(_)표시

숫자 사이에 언더스코어(_)를 넣을 수 있게 되어 가독성을 향상시킬 수 있게 되었습니다.
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

switch 구문에서 String 사용

그동안 switch 구문에 기본형과 열거형만 사용할 수 있었고 String 을 사용할때는 다수의 if else 문으로 제어문을 구성해야 했다면 Java 7 부터는 switch 구문에서 String 을 사용할 수 있게 되었습니다.
public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
  String typeOfDay;
  switch (dayOfWeekArg) {
    case "Monday":
      typeOfDay = "Start of work week";
      break;
    case "Tuesday":
      case "Wednesday":
      case "Thursday":
        typeOfDay = "Midweek";
        break;
      case "Friday":
        typeOfDay = "End of work week";
        break;
      case "Saturday":
      case "Sunday":
        typeOfDay = "Weekend";
        break;
      default:
        throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
  }
  return typeOfDay;
}

다이아몬드(<>)

제네릭 인스턴스를 생성할 때 그동안 인스턴스 선언/생성 양쪽에 모두 타입을 적어주었어야 했었습니다.
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
다이아몬드 기호(<>) 표시만으로 인스턴스 생성 부분에서의 타입을 생략할 수 있게 되었습니다.
Map<String, List<String>> myMap = new HashMap<>();

try-with-resources (Api level 19)

그동안 사용 후 close() 메서드를 호출하여 자원을 반납해야 했던 InputStream/OutputStream 등은 Java 7 에서 try 구문 시작시 간단한 선언으로 자동으로 자원반납이 가능하게 되었습니다.
static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
  BufferedReader br = new BufferedReader(new FileReader(path));
  try {
    return br.readLine();
  } finally {
    if (br != null) br.close();
  }
}
Java 7 이전까지는 이렇게 BufferedReader 를 사용하고 난 후 finlly 에서 close() 를 호출해 stream 을 닫아주어야 했었다면 아래 코드와 같이 try 구문이 시작할 때 BufferedReader 선언하면 try 구문이 끝날 때 자동으로 close() 를 호출하게 됩니다.
static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }
}
주의: AutoCloseable interface 에 의한 close() 호출이기 때문에 Api level 19(Kitkat) 버전부터 사용할 수 있습니다.

multi-catch Exception

그동안 예외를 처리할 때 서로 다른 예외간 처리방식은 동일함에도 불구하고 같은 내용의 코드를 중복 작성해야 하는 불편함이 있었습니다.
catch (IOException ex) {
    logger.log(ex);
    throw ex;
catch (SQLException ex) {
    logger.log(ex);
    throw ex;
}
Java 7 에서는 '|' 연산자로 여러개의 예외를 한번에 묶어 처리할 수 있게되었습니다.
catch (IOException|SQLException ex) {
  logger.log(ex);
  throw ex;
}

참고 사이트




-- 위 문서 출저: http://googledevkr.blogspot.kr/2014/01/using-java7-in-android.html

너무 좋은 문서라 퍼왔슴당

오늘은 Google I/O 2013 에서 발표되었던 Volley 라는 Network&ImageLoading Framework 에 대해서 블로깅 해보려고 합니다.

이번 프로젝트에서 저는 Network 통신을 위해서 사용한 라이브러리 인데, 매우 만족하고 이에 대해 블로깅하고 정보를 공유하고자 합니다.


Volley의 주요 기능은 다음과 같습니다.



  ● 요청작업큐(RequestQueue) + Thread pool을 이용한 동시 요청 지원.

  ● 요청별 우선 순위 : 목록조회와 이미지 다운로드를 할때 목록조회가 우선순위가 높게 설정. 다음 페이지의 목록조회를       요청하면 이전페이지의 이미지로딩이 끝나지 않아도 기다리지 않고 수행. 

      (A요청이 B요청보다 먼저 응답을 받아야 할 경 우와 같이)

  ● Transparent cache : 요청하는 쪽에서 Cache 적용여부를 의식하지 않아도 됨

  ● 이미지 로딩툴, NetworkImageVIew라는 View 제공

  ● 요청 취소 : 특정 요청, 해당 Context의 요청 모두 취소할 수 있고, 취소할 규칙도 지정 가능

  ● 진저브레드 이전의 HttpURLConnection의 버그 문제 해결 : 

      2013년 5월 The platform에 기고한 Android의 HTTP 클라이언트 라이브러리 기사에서 다룬 여러 오픈소스가 그랬던  

      것처럼 진저브레드 이상에서만 java.net.HttpURLConnection을 쓰는 로직이 들어가 있습니다.

  ● retry, backoff policy 지원, 확장 기능

  ● SPDY 지원 : 발표 당시에는 Volley의 tranport stack으로 OkHttp( http://square.github.io/okhttp/ ) 를 넣는 작업이 

      누군가가 진행하고 있다고 했는데, 기사를 작성한 이후에 따끈따끈하게 공개 되었습니다.

  ● JSON, XML, Image, protobuffer 등 다양한 Response형식을 처리하도록 확장 가능



위와 같이 아주 유용하고 필요한 기능들이 기본적으로 내장되어있으며, 오픈소스라서 사용자에 맞게 커스터마이징도 가능한 점도 굳굳!



그리고 StringRequest, JSONObjectRequest, JSONArrayRequest 등 형식에 맞는 Request도 별도의 작업 없이 가능합니다.


또한 많은 분들이 ImageLoading 즉 웹으로부터 이미지를 다운로드 받아서 보여주기 위한 라이브러리로도 많이사용하시는데요!

그 목적으로 사용하시기에도 아주 좋은 기능들이 가득 포함되어있습니다.

이미지 로딩 부분에서의 장단점을 다루기에는 너무 많은 양이기 때문에 좋은 블로그 글을 소개시켜드리겠습니다.

[Android의 이미지 로딩 라이브러리 -> http://helloworld.naver.com/helloworld/429368 ]



아무튼! 저는 Network 통신을 위한 기본적인 방법들을 소개해드릴겁니다.



Volley 사용하기


Volley를 기본적으로 다운로드하고 프로젝트에 import 했다고 가정한 상태에서 예제 소스를 통해서 설명드리겠습니다.



위와 같은 요청이 가장 기본적인 Volley의 NetworkRequest 방법입니다.

http://rootnix.in 에 Get Request  를 보내고 Response 를 받아오는 거죠.


  StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener)


위와 같이 String 만으로 받는것뿐 아니라, 요청에 파라미터를 넣고 응답받는 형식도 다른 형식으로 받을 수 도 있습니다.


위와 같이 JsonObject를 파라미터로 주고 Response 또한 JsonObject 로 받을 수 있어서 Restful Api 를 사용하기에 아주 좋습니다.


 JsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener)




Volley를 얼마나 잘 활용하느냐에 따라서 네트워크 통신 모듈을 작성하시는데 있어서 편리함과 유용함을 한번에 느끼실 수 있으실 겁니다 :D


더 자세한 활용법은 연락주시면 더 도와드리도록 하겠습니다.



Volley 다운로드 - git

 git clone https://android.googlesource.com/platform/frameworks/volley

https://android.googlesource.com/platform/frameworks/volley )

현재 진행중인 프로젝트를 진행하면서 어플에서 해당번호로 한뼘통화(스피커폰)를 거는 이슈가 있었다.

해당 이슈는 어려운부분은 아니지만 한글로 된 가이드를 찾아보지 못해서 이렇게 적어본다.



전화를 거는데는 TelephonyManager 와 통화상태를 확인할 StatePhoneReceive,

그리고 스피커폰을 제어할 AudioManager 가 필요하다.


그리고 Manifest 에

MODIFY_AUDIO_SETTINGS

CALL_PHONE

READ_PHONE_STATE

퍼미션이 필요하다.






이렇게 Permission 을 설정해줘야한다.

그리고 java 소스는 다음과 같다.




Android 어플을 개발 하다 보면 사진,음악,동영상 등을 만든 후 스토리지에 저장하는 일을 만나곤 한다.

저장해서 path를 불러온 후 사용하는것 까진 문제가 없는데, 보통 저장후에 저장한 파일을 리스트에 불러오는데에 문제가 발생하곤한다.


안드로이드는 미디어를 저장한 후 미디어저장소를 갱신하는데 까지 꽤 오랜 시간이 걸린다.

그래서 자신이 미디어를 저장함과 동시에 그 미디어를 스캐닝처리를 해주어야, 바로 재사용이 가능하다.






이와 같이 저장한 파일의 경로로 스캐닝 해주거나

주기적으로 스토리지 전체를 스캐닝 해주는 방법으로 해결할 수 있다.

그리고 위의 방법은 Intent 의 Action 만 바꿔줌으로서 action 을 지정 할 수 있다.



ps. 는 애인알람 개발하다 내가 필요해서 ...

1. menu - Help - Install New Softerware

2. Click Add Button - http://www.jgit.org/updates - OK

3. checks the Eclipse EGit / JGit / JGit Command Line Interface - OK

 








티스토리 툴바