마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

제 소스가 옳바른 변수 접근 방식이 맞나요?

0 추천

실제 구동 소스는 아니고 제가 짜놓은 소스의 간략한 흐름입니다.

아래와 같은 구조로 작동시킬때 Test에 설정된 변수에 접근하는게 맞는지 궁금하네요.

클래스,인스턴스,지역 변수를 보아하니 전혀 옳바르지 않은거 같은데

로그를 하나씩 찍어보면 찍히는게 보이긴 하거든요? 오류로 인한 접근인지 알고싶습니다. 

한수 가르침 부탁드릴게요 

run에서 while문을 돌리고 hanlder 안에서 맞는 결과값을 받아 abcd에 넣어 while문을 달출한다

는 그림이거든요. 

public class Test implements Runnable{

    public String abcd ;

    public Test(String abcd) {
        this.abcd = abcd;
    }

    @Override
    public void run() {

        do{

            if(abcd=="hihihi"){
                break;
            }

            try {

                Message msg = new Message();
                msg.obj = abcd;

                Thread.sleep(1000);
            }catch(InterruptedException es){
                es.printStackTrace();
            }

        }while(true);

    }

    @SuppressLint("HandlerLeak")
    Handler handler = new Handler(){
        public synchronized void  handleMessage(Message msg){
            String dum = String.valueOf(msg.obj);

            if(dum=="hello"){
                abcd="bye";
            }
            FirebaseDatabase.getInstance().getReference().child("market")
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for (DataSnapshot item : dataSnapshot.getChildren()) {

                                if(결과값이 참일 경우){
                                    abcd = "hihihi";  <------ 이게 제대로 접근되고 있는게 맞나요?
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                        }

                    });
        }
    };
}

 

 

nickeun (540 포인트) 님이 2018년 4월 13일 질문

2개의 답변

0 추천
첨부된 코드 상에서 handler를 동작시키는 코드는 없네요.

그래서 의도된 동작을 알 수 없지만, 어찌되었든 handler 내 anonymous Listener에서

'abcd' 멤버 변수를 접근하는건 문법적으로는 문제가 없습니다.
디자이너정 (42,810 포인트) 님이 2018년 4월 13일 답변
아하! 다행이네요 ^^ 답변 정말 감사합니다.~
0 추천
동작은 하겠지만 Thread에서 값을 바꾸시다보니, 여러 Thread를 돌리실 경우

Thread Safety에 문제가 있을 수 있습니다.
아래글을 참조 해 보세요..
http://hugrypiggykim.com/2016/07/09/java-thread-safe-programming/
익명사용자 님이 2018년 4월 13일 답변
아하! 그렇군요. 정말 감사합니다
...