pinkred's mobile program

pinkred mobile programer

Archive for 11월 2016

[Android] Retrofit2, Volley Test

leave a comment »

요즘에 Volley에서 아파치 라이브러리 이슈로 에러가 리포팅 되어서 요즘 인기가 많다는 Retrofit을 써보려고 했으나 관문이 너무 많아서 일단 속도 테스트를 해보았다.

  1. Retrofit를 적용하려면 기존의 JSONObject 방식에서 POJO방식으로 변환하기에는 너무나 많은 시간이 걸리기에 대체 방안을 생각하였다.
  2. GSON의 JsonParser를 이용하여 기존의 JSONObject와 비슷하여 POJO 방식 변경하는 것보다는 시간이 덜 걸릴것 같았다.
  3. Volley + GSON(JsonParser) 을 전부 변화하고 나니 이슈가 발생하였다. value=null인것들을 기존에는 JSONObject가 알아서 null을 넣어주었나 GSON에서는 일일이 null체크를 해주어야 하니 기존에 쌓아둔 업적이 너무 많아서 고민을 하게 되었다.
  4. 그러던 와중 속도 테스트라도 해보기로 했다. 1차 적으로 Volley + GSON(JsonParser) 과 Volley + JSONObject의 속도를 측정해보기로 했다.  파싱 속도만 측정했다. Volley를 사용하기 때문에 받은 데이터를 String로 변환시키고 나서 파서가 동작된다.
리스트 파싱 속도(ms)
GSON JsonParser
JSONObject
108
86
87
86
76
51
52
58
47
70

5. 속도 비교를 하고 나서 다시금 바꾸고 싶지 않았지만 실제 모든 방식으로 테스트 해봐야 하기 때문에 아래와 같이 테스트해보았다. 아래 테스트는 리스트를 요청하는 네트워크 시간과 파싱하는 시간을 같이 체크했다. 시간이 많이 나오는 경우는 캐쉬가 동작하지 않는 경우이다. 실제 데이터를 보면 Volley를 이용할때보다 Retrofit을 이용할때 속도가 더 빨랐으며 POJO 방식을 사용할때 조금더 빨랐다.

리스트
Retrofit + GSON(POJO)
Volley + GSON(JsonParser)
Volley + JSON
Volley + GSON(POJO)
Retrofit + GSON(JsonParser)
request → response 후 파싱까지만 4630
210
192
4526
310
213
188
4491
4675
344
402
406
4593
410
457
389
4661
342
4660
381
367
361
4630

375

425
482
4736
422
396
365
455
4661
4897
241
204
312
252
247
4575
273

Written by pinkredmobile

2016/11/21 at 6:12 pm

[Android] 디버그 라이브러리 소개

leave a comment »

Stetho
안드로이드 디버그 관련된 라이브러리 이다. 한방에 오케이라고 모든것을 한번에 할수있도록 해준다. GUI, Network, Preference, SQLite까지 모든것을 볼수 있다.

도움 사이트 : http://blog.naver.com/tmondev/220858379637, https://github.com/facebook/stetho, http://www.slideshare.net/kingori/ss-68326596

Leakcanary
앱에 leak 이 있는지 여부를 판단해 주는 라이브러리이다. leak이 발생하면 노티로 알려준다.

도움 사이트 : http://pluu.github.io/blog/android/2015/09/11/leakcanary/

Written by pinkredmobile

2016/11/18 at 2:24 pm

프로그래밍(programming)에 게시됨

Tagged with , ,

Android ListView item mask effect

leave a comment »

ListView 에서 배경 특정 위치에 구멍이 뚫려있는 GUI 가 발생하여 어떻게 할지 의문이였다.

List Item 행은 항상 그 구멍을 지나가는데 아래와 같다. 상단의 펀치와 같은 영역이 리스트 아이템의 상단 영역을 차지하고 있고 리스트가 움질일때 마다 해당 영역은 계속 적으로 유지되어야 한다.

screenshot_1478220429 screenshot_1478220577

백그라운드의 Drawable를 상속받아서 해당 영역을 위치에 따라서 마스크를 처리하는 방식으로 처리하였다. 참고로 마스크 처리시에 뒷배경이 보이기 때문에 한번더 같은 색상(이미지)으로 덮어주어야 한다.


class BackgroundDrawable extends Drawable
{
private View mView;
private Paint mPaint;
private float mMarginTop;
private Paint mOverPaint;
private Bitmap mCircleBitmap;

public BackgroundDrawable(View view)
{
mView = view;
mMarginTop = dpToPx(view.getContext(), 10);

mCircleBitmap = BitmapFactory.decodeResource(mView.getResources(), R.drawable.circle);

mPaint = new Paint();
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

mOverPaint = new Paint();
mOverPaint.setAlpha(0x99);
}

@Override
public void draw(Canvas canvas)
{
float y = mView.getY();

canvas.drawColor(0xff00ff00);

if (y <= mMarginTop)
{
float cY = Math.abs(mMarginTop - y) - mCircleBitmap.getWidth() / 2 - mMarginTop / 2;
float cX = mView.getX() - mCircleBitmap.getWidth() / 2;

canvas.drawBitmap(mCircleBitmap, cX, cY, mPaint);
canvas.drawBitmap(mCircleBitmap, cX + mView.getWidth(), cY, mPaint);

canvas.drawBitmap(mCircleBitmap, cX, cY, mOverPaint);
canvas.drawBitmap(mCircleBitmap, cX + mView.getWidth(), cY, mOverPaint);
}

invalidateSelf();
}

@Override
public void setAlpha(int alpha)
{

}

@Override
public void setColorFilter(ColorFilter colorFilter)
{

}

@Override
public int getOpacity()
{
return PixelFormat.TRANSPARENT;
}
}

업데이트 – 2016.11.04
조금더 고민해 보니 마스크가 필요한 영역에 위에 View를 추가한다음에 해당 View의 Background를 위의 코드로 마스크를 하면 동일한 효과를 줄수가 있다.

Written by pinkredmobile

2016/11/04 at 10:01 am

프로그래밍(programming)에 게시됨

Tagged with ,