toolbar는 어느 뷰에서나 종속관계 상관없이 다채롭게 사용가능

해당 위젯은 롤리팝 부터 나온 위젯이기 때문에(API level 21) 만약 하위 os에서 쓰고 싶다면 서포트 라이브러리가 필요하다.

actionBar 대신에 toolbar를 쓸 것 이므로, 액션바가 없는 테마로 변경해야한다.

'안드로이드' 카테고리의 다른 글

RecyclerView (admob) 추가하기  (0) 2017.04.05
CoordinatorLayout  (0) 2017.04.05
ButterKnife  (0) 2017.04.05
RecyclerView  (0) 2017.04.05
서비스의 종류  (0) 2016.08.18

RESTAPI를 이용해서 데이터를 가져올때 JSON을 내가 원하는 데이터로 수정하는

파싱작업의 귀찮음을 최소화할수있고, 네트워크 비동기, 동기 통신 또한 

매우 편하고 깔끔하게 구현 할 수 있도록 다양한 메소드를 제공한다.




인터넷 통신을 하기 위해 퍼미션을 추가

<uses-permission android:name="android.permission.INTERNET"/>



Retrofit 2 추가

build.gradle 파일에 아래와 같이 Retrofit 2를 추가합니다.

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'




public class RetrofitCreator {

private static final String SERVER = "http://xxx";

public static Retrofit createRetrofit() {

return new Retrofit.Builder()
.baseUrl(SERVER)
.addConverterFactory(GsonConverterFactory.create())
.build();

}
}

baseUrl의 요청하는 서버의 도메인이나, IP:PORT 정보를 입력해주고, 

addConverterFactory 메소드로 Response 데이터의 파싱을 담당할 객체를 생성해준다.

GSON을 이용하여 JSON 파싱을 했기 떄문에, 위와 같이 작성





인터페이스 class 만들기


요청 메소드

모든 메소드들은 반드시 상대 URL과 요청 메소드를 명시하는 어노테이션을 가지고 있어야합니다. 기본으로 제공하는 요청 메소드 어노테이션은 다음과 같이 5개가 있습니다 : GET, POST, PUT, DELETE, HEAD.


@FormUrlEncoded 어노테이션을 메소드에 명시하면 form-encoded 데이터로 전송 됩니다. 각 key-value pair의 key는 어노테이션 값에, value는 객체를 지시하는 @Field 어노테이션으로 매개변수에 명시하시면 됩니다.


Multipart 요청은 @Multipart 어노테이션을 메소드에 명시하시면 됩니다. 각 파트들은 @Part 어노테이션으로 명시합니다.

Multipart의 part는 Retrofit 의 컨버터나, RequestBody 를 통하여 직렬화(serialization) 가능한 객체를 사용하실 수 있습니다.

interface Api {
//회원가입
@FormUrlEncoded
@POST("/mobile/signup.php")
Call<ServerResponse> signUp(
@Field("id") String id,
@Field("name") String name,
@Field("passwd") String passwd,
@Field("token") String token,
);

//회원정보수정
@Multipart
@POST("/mobile/signmodfiy.php")
Call<ServerResponse> signModify(
@PartMap() Map<String, RequestBody> partMap,
@Part MultipartBody.Part body

);





public class ChatApi {

private static ChatApi.Api api;

private static ChatApi instance;

private ChatApi () {
Retrofit retrofit = RetrofitCreator.createRetrofit();
api = retrofit.create(Api.class);
}

public static ChatApi getInstance () {
if ( instance == null ) {
instance = new ChatApi();
}

return instance;
}

//회원가입
public Call<ServerResponse> signUp(String id, String name, String passwd,String token ) {

return api.signUp(id, name, passwd, token);
}

//회원정보수정
public Call<ServerResponse> signModify(MultipartBody.Part body, Map<String, RequestBody> partMap) {
return api.signModify(partMap, body);
}

retrofit의 구현체에게 인터페이스의 class 정보를 보내준다






public class ServerResponse {

private int success;
private String message;

public int getSuccess() {
return success;
}

public String getMessage() {
return message;
}
}

요청결과를 파싱할 모델 클래스





chatApi.signUp(id, name, passwd, token).enqueue(new Callback<ServerResponse>() {
@Override
public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {

if (response.body().getSuccess() == 1) {

}
}

@Override
public void onFailure(Call<ServerResponse> call, Throwable t) {

}
});

서비스의 인터페이스에 서술해뒀던, 메소드를 호출하면서, 파라메터만 넘겨준다.

'안드로이드 > Retrofit 2' 카테고리의 다른 글

Retrofit2 파일업로드  (0) 2017.04.05

@BindView를 통해 기존의 findViewById로 했었어야 했던 뷰와 액티비티 변수 간의 Binding이 보다 간편

@OnClick annotation으로 onClickListener도 없이 onClick을 구현


@BindViews({ R.id.checkbox1, R.id.checkbox2, R.id.checkbox3, R.id.checkbox4,
R.id.checkbox5, R.id.checkbox6, R.id.checkbox7, R.id.checkbox8,
R.id.checkbox9, R.id.checkbox10, R.id.checkbox11, R.id.checkbox12
})
List<CheckBox> CheckBoxViews;

View를 (CheckBox)  List에 담아 놓고 관리 할 수 있다.



ButterKnifeZelezny – 안드로이드 스튜디오 플러그인으로 선택한 레이아웃 XML에서 버터나이프 인젝션으로 변환해줍니다.

'안드로이드' 카테고리의 다른 글

CoordinatorLayout  (0) 2017.04.05
Toolbar  (0) 2017.04.05
RecyclerView  (0) 2017.04.05
서비스의 종류  (0) 2016.08.18
SharedPreferences ArrayList 저장  (0) 2016.08.03

RecyclerView 는 Android 5.0 버전 발표와 함께 Support-Library-V7에 정식추가가 되어 지원되기

시작한 View 입니다. 이전에는 ListView를 사용하여 왔는데, ListView가 커스텀하기에 어렵고,

구조적으로 성능상 문제가 있어, 이를 대체 있게 되었습니다.

 

RecyclerView는 기본적으로 LayoutManager를 사용하여 Item 을 관리하고

LayoutManager를 통해 효과적으로 item을 정렬하고 애니메이션등을 다룰 수 있습니다.


주요 클래스로는

 

 Adapter

 기존의 ListView에서 사용하는 Adapter 같은 개념으로 data item 대한 view 생성 

 ViewHolder

 재활용 View 대한 모든 서브 view 보유

 LayoutManager

 item 항목을 배치

 ItemDecoration

 item 항목에서 서브 view 대한 처리

 ItemAnimation

 item 항목이 추가, 제거 되거나 정렬 애니메이션 처리


'안드로이드' 카테고리의 다른 글

Toolbar  (0) 2017.04.05
ButterKnife  (0) 2017.04.05
서비스의 종류  (0) 2016.08.18
SharedPreferences ArrayList 저장  (0) 2016.08.03
picasso  (0) 2015.08.01

서비스의 종류 


Android Service는 백그라운드에서 실행되는 프로세스입니다. 

안드로이드 OS에서 특별한 경우를 제외하고는 백그라운드에서 동작하도록 설계되어 있습니다. 


Background Service

우리가 흔히 말하는 서비스가 백그라운드 서비스 형태입니다. 시스템의 메모리가 부족할 경우 시스템이 해당 서비스를 강제로 종료시킬 수 있습니다. 


onStartCommand()의 파라메터를 이용하여, 서비스의 종료시 동작을 정의할 수 있습니다.

START_NOT_STICKY : 서비스가 종료되었을 때, 서비스 재 실행을 하지 않음

START_STICKY : 서비스가 종료되었을 때, 서비스를 재 실행 함. onStartCommand()를 호출하며 파라메터는 null 임

START_REDELIVER_INTENT : 서비스를 재 실행하며, 기존의 Intent 파라메터를 이용하여 onStartCommand()를 호출함



백그라운드 서비스 생성이 허용되지 않는 상황에서 Android O를 대상으로 하는 앱이 startService() 메서드를 사용하려고 시도할 경우 

이제 이 메서드가 IllegalStateException을 발생합니다.


새로운 Context.startForegroundService() 메서드가 포그라운드 서비스를 시작합니다. 

앱이 백그라운드에 있는 중에도 시스템은 앱이 Context.startForegroundService()를 호출하도록 허용합니다. 


시스템이 서비스를 생성한 후, 앱은 5초 이내에 해당 서비스의 

startForeground() 메서드를 호출하여 새 서비스의 알림을 사용자에게 표시해야 합니다. 

앱이 이 시간 한도 내에 startForeground()를 호출하지 않으면 

시스템이 서비스를 중단하고 이 앱을 ANR로 선언합니다



Foreground Service

서비스의 우선 순위가 높아서, 시스템의 메모리가 부족하더라도 강제로 종료시키지 않습니다. 

대신 상태바에 Notification이 표시됩니다. 과거에는 상태바에 Notification을 표시하지 않고도 

Foreground Service로 실행할 수가 있었는데, 

현재는 구글 정책으로 Foreground Service를 

수행하기 위해서는 무조건 사용자에게 표시를 해야 하도록 변경되었습니다.



1. 시작 타입의 서비스(Started Service)

startService()를 호출해서 서비스를 시작하면 시작타입의 서비스가 됩니다. 이러한 서비스는 한 번 시작되면 백그라운드에서 무한정 실행되지만 보통은 서비스에서 해야할 작업이 끝나면 스스로 종료하는 경우가 대부분이죠. 이러한 형태의 서비스는 호출자에게 결과값을 반환할 수 없으며 파일 다운로드나 음악재생 등에 사용됩니당.


2. 연결타입의 서비스(Bound Service)

bindService()를 호출해서 서비스를 시작하면 연결타입의 서비스가 됩니다. 연결타입의 서비스는 클라이언트-서버와 같이 동작하는 것이 특징이죠. 즉 액티비티는 서비스에게 어떤 요청을 전송하고 서비스는 결과값을 반환해주는 형태입니다. 이러한 형태의 서비스는 액티비티와 연결되어 있는 동안에만 실행되고 액티비티가 사라지면 서비스도 소멸됩니다. 또한 하나의 서비스에 다수의 액티비티가 연결될 수도 있슴니다.

'안드로이드' 카테고리의 다른 글

Toolbar  (0) 2017.04.05
ButterKnife  (0) 2017.04.05
RecyclerView  (0) 2017.04.05
SharedPreferences ArrayList 저장  (0) 2016.08.03
picasso  (0) 2015.08.01

Abstract Class

- 추상메서드를 하나 이상 가진 클래스

- 하위 클래스를 참조하여 상위 클래스의 객체를 생성

- 하위 클래스를 제어하기 위해 사용


new 연산자로 인스턴스 생성 불가능.


추상 클래스는 추상 메소드를 가질 수 있다. 추상메소드는 하위에서 반드시 오버라이드 하라는 강제성을 가지는 메소드이다.


'자바' 카테고리의 다른 글

팩토리얼(Factorial)  (0) 2017.08.18
선택정렬  (0) 2017.04.13
삽입정렬  (0) 2017.04.13
비트연산자  (0) 2017.04.07
자바  (0) 2017.04.05

www.tinypng.com

'기타' 카테고리의 다른 글

유용한 사이트  (0) 2016.03.02

      //저장

public static void saveSharedPreferences_Data(Context context, String key, ArrayList<String> dic) {

SharedPreferences pref =

                context.getSharedPreferences(APP_SAVE_NAME,Context.MODE_WORLD_READABLE);

SharedPreferences.Editor edit = pref.edit();

Set<String> set = new HashSet<String>();

set.addAll(dic);

edit.putStringSet(key, set);

edit.commit();

}


       //꺼내기

public static ArrayList<String> loadSharedPreferencesData(Context context, String key) {

SharedPreferences pref = 

                context.getSharedPreferences(APP_SAVE_NAME,Context.MODE_PRIVATE);

Set<String> set = pref.getStringSet(key, null); 

return new ArrayList<String>(set);

}

'안드로이드' 카테고리의 다른 글

Toolbar  (0) 2017.04.05
ButterKnife  (0) 2017.04.05
RecyclerView  (0) 2017.04.05
서비스의 종류  (0) 2016.08.18
picasso  (0) 2015.08.01

+ Recent posts