Android
레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시

2020년 6월 27일 토요일

[Android] firebase database 데이터 삭제 방법

firebase Database 데이터 삭제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Query query =databaseReference.child("message").orderByChild("userName").equalTo(editTextName.getText().toString());
                query.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        for(DataSnapshot ds:dataSnapshot.getChildren()){
                      Log.d("getKey",ds.getRef().toString());
                            ds.getRef().removeValue();
                            //Toast.makeText(MainActivity.this, dataSnapshot.getKey().toString(), Toast.LENGTH_SHORT).show();
                        }

                    }
                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                    }
                });
cs




equalTo를 이용하여 userName값이 "temp"인지 확인합니다.
snapshot은 말 그대로 한 순간이죠. 여기엔 쿼리(위에서 언급한 equalTo..)에 맞는 특정 데이터 값이 들어있습니다. 
꼭 dataSnapshot.getChildren() 를 하고서 참조로 접근해야 합니다.
그냥 참조로 냅다 접근해서 삭제하면 Tree 방식으로 이루어져 있기 때문에 전부 삭제될 수 있습니다.

2020년 6월 24일 수요일

[Android] 갤러리 이미지 읽기, 쓰기 코드

할 때 마다 애매한 부분이 있어서 찾아보게 되는 고생을 덜기 위해 정리해 보았다 ;;



1
2
3
4
5
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
       temp += Manifest.permission.READ_EXTERNAL_STORAGE + " ";
   }
   if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
       temp += Manifest.permission.WRITE_EXTERNAL_STORAGE + " "; }
cs

 " "로 구분자를 넣은 이유는 split로 String 배열을 만들어 넘겨주기 위해서다.
requestPermissions의 인자값을 보면 permissions 이 String[] 으로 선언되어서 사용자의 여러 요청을 받을 수 있다. 

public static void requestPermissions(final @NonNull Activity activity,        final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode)


1
2
3
4
  if (TextUtils.isEmpty(temp) == false)
       {//split는 특정 구분문자를 중심으로 배열로 바꿔준다.
           ActivityCompat.requestPermissions(this, temp.trim().split(" "),1);
       }
cs

사용자에게 요청을 해야 이미지를 비트맵으로 바꾸던가 해서 안드로이드 view에 설정할 수 있다. 

2020년 6월 1일 월요일

[Android] Handler 사용 Memory Leak


내부 클래스 Inner Class
외부 클래스 Outer Class
Static의 개념을 알아야 한다.

Handler mHandler = new Handler(); mHandler.postDelayed(new Runnable() { public void run() {             Do Something } }, 1000);

기능은 다양하게 사용되겠지만 UI 변경을 위해 많이 사용합니다.
그냥 생각없이 사용하다가 이런 사용법은 메모리 누수가 된다는 것을 알아버렸다..
사실 Activity 생명주기가 끝나면 끝나겠지 했는데 , 잘 생각해보면 Handelr의 메세지는 메모리 큐 라는 곳으로 향합니다. 메인쓰레드에서 UI 처리를 당하기 위해서죠.
그런데 내부 클래스인 Handelr




참고
https://medium.com/@joongwon/android-memory-leak-%EC%82%AC%EB%A1%80-6565b817a8fe
https://m.blog.naver.com/yoonhok_524/221724647242

2020년 5월 31일 일요일

AttributeSet attrs

참고 :
https://gun0912.tistory.com/38
https://stackoverflow.com/questions/5316686/what-is-attributeset-and-how-can-i-use-it
https://gogorchg.tistory.com/entry/Android-CustomView%EC%97%90-Attribute-%EB%A7%8C%EB%93%A4%EA%B8%B0

2020년 5월 26일 화요일

Glide

Glide란?

  • 이미지 로딩 라이브러리이다. 
  • API를 사용하여 쉽게 조작할 수 있다. 

우선 build.gradle 안에 
implementation 'com.github.bumptech.glide:glide:4.9.0'                                                                              annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'


Glide.with(this)
    .load(url)
    .into(imageView);

간단하게 사용하는 방법을 위에 있는 문장을 사용하여 괄호() 안에만 넣어주면 된다.                     자동적으로 다운샘플링 되기 때문에 이미지 사이즈를 줄여서 저장하게 된다. 
여기서 궁금한 점! 대부분의 글이나 이미지를 불러온다면 open 을 명시해주고 close로 닫아준다. 과연 우리의 Glide는 어떤 방법을 써야할까 .
Glide.with(fragment).clear(imageView);
이렇게 사용해야겠지만                                                                    this에 대한 Activity가 destroy 될 때 , 자동으로 clear 된다. 
이 밑에 부터는 제가 필요한 것만 정리해 놓았습니다.

Background Threads

FutureTarget<Bitmap> futureTarget =
  Glide.with(context)
    .asBitmap()
    .load(url)
    .submit(width, height);

Bitmap bitmap = futureTarget.get();

// Do something with the Bitmap and then when you're done with it:
Glide.with(context).clear(futureTarget);

에러처리를 요청으로 

Glide.with(fragment)
  .load(primaryUrl)
  .error(
      Glide.with(fragment)
        .load(fallbackUrl))
  .into(imageView);

Option 적용 

RequestOptions options = 
    new RequestOptions()
      .set(MyCustomModelLoader.TIMEOUT_MS, 1000L);

Glide.with(context)
  .load(url)
  .apply(options)
  .into(imageView);

참고:https://bumptech.github.io/glide/




2020년 5월 5일 화요일

Observer and Observable 차이

Observer

  • interface





Observable

  • class


참고 : https://www.javaworld.com/article/2077258/observer-and-observable.html

2020년 4월 23일 목요일

android AsyncTask 왜 사용할까 ?

Main Thread?
UI Thread?
AsyncTask를 포스팅 하는데 저 위에 쓰레드들이 거슬린다.
그래서 찾아보니
안드로이드의 메인스레드는 주요 컴포넌트를 실해하는 곳이면서, UI Thread를 갱신하거나 수행하는 유일한 Thread 이다. 그래서 메인 스레드를 UI Thread라고 부르는 경우도 있다.

AsyncTask 아니 이놈은 왜? 써야할까 
서칭하면 대부분 httpConnetction을 사용과 함께  십중팔구 AsyncTask를 사용한다. 
AsyncTask 흐름과 구성 설명으로는 내 궁금증이 해소되지 않는다. 
그렇기에 찾아봤다. 
안드로이드 화면에서 View ViewGroup은 싱글스레드 모델을 원칙으로 돌아간다. 긴 시간이 걸리는 작업을 메인 Thread에서 담당한다면 애플리케이션 반응성이 떨어질 수 있고, 사용자의 불편함이 증가한다. 그래서 긴 작업에 대한 접근으로 여분의 스레드를 메인 Thread와 분리

해야 하고,메인 Thread와  다른 쓰레드간 통신하는 방법이 필요하게 된다. 

HandlerThread,  Thread 등을 관리해야 하는 코드를 작성해야 한다.
다만 AsyncTask를 사용하면 가독성도 높아질 수 있고 쓰레드에 대한 개념을 알고 사용하면 좋겠지만 잘 모르는 사람도 캡슐화가 잘 되어있어서 사용가능하다.
궁금증 해결 완료! ! 


-끝- 

참고
https://academy.realm.io/kr/posts/android-thread-looper-handler/
https://itmining.tistory.com/5

2020년 4월 22일 수요일

안드로이드 기본 Layout 속성 의미정리



참고
https://www.tutorialspoint.com/android/android_ui_design.htm

android UI UX


UI에 대한 프로그램 추천

전반적인 black white UI 설명
https://material.io/design/color/dark-theme.html#properties

UI 움직임 페턴 설명 (app & user 상호작용)
https://material.io/design/material-studies/basil.html#motion

UI UX 모아놓은 사이트
https://monsterdesign.tistory.com/1630
화면찾기
https://medium.com/google-design/how-to-find-device-metrics-for-any-screen-62b9ad84d097
참고
https://www.mockplus.com/blog/post/android-ui-design-tool
© 특히하고 특별한
Maira Gall