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

참조된 객체 정보변경 오류

0 추천
// DetailActivity.java

public class DetailActivity extends AppCompatActivity {
    MqttHandler mqttHandler;
    View yun_fragment, switch_fragment;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        //MQTT 연결
        mqttHandler = new MqttHandler(this.getApplicationContext());
        mqttHandler.initConnection(pubTopic, subTopic);

        ...
  
        yun_fragment = (View) findViewById(R.id.detail_fragment_rc1_area);
        switch_fragment = (View) findViewById(R.id.detail_fragment_relay_area);

        //전등페이지 or RC카 페이지 확인
        switch (page_type) {
            case 0: // 릴레이
                getSupportActionBar().setTitle("전등");
                yun_fragment.setVisibility(View.GONE);
                switch_fragment.setVisibility(View.VISIBLE);
                break;

            case 1: // RC카
                getSupportActionBar().setTitle("무선 RC CAR");
                yun_fragment.setVisibility(View.VISIBLE);
                switch_fragment.setVisibility(View.GONE);
                break;

            case 9999:
                Toast.makeText(DetailActivity.this, "잘못된 접근입니다.", Toast.LENGTH_SHORT).show();
                finish();
                break;
        }
        ...
  }
...
public MqttHandler mqttHandler() {
        return this.mqttHandler;
    }
}

먼저 Fragment를 띄워주는 베이스 Activity입니다.

이 부분에서 객체를 넘겨주는 메소드를 하나 만들어서 객체에 내장된 메소드나 변수를 Fragment에서 사용

하려구 하는데요

 

// RelayFragment.java

public class RelayFragment extends Fragment {
    DetailActivity detailActivity;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_relay, container, false);

        detailActivity = (DetailActivity) getActivity();

        ...

        Switch_Status = new ArrayList<>();
        Switch_Status.add(new Switch_Data("Light 1", true, true, pubTopic+"1", subTopic+"1"));
        Switch_Status.add(new Switch_Data("Light 2", false, false, pubTopic+"2", subTopic+"2"));

        for(int position = 0; position < Switch_Status.size(); position++) {
break-> detailActivity.mqttHandler().pTopic = Switch_Status.get(position).pubTopic;
            detailActivity.mqttHandler().pTopic = Switch_Status.get(position).subTopic;
            detailActivity.mqttHandler().subscribeToTopic();

            new GetStatusTask().execute(position);
        }

        mAdapter = new Switch_Adapter(Switch_Status, RelayFragment.this);
        mRecyclerView.setAdapter(mAdapter);
        return v;
    }

....
    // mAdapter 로 생성된 스위치가 동작할때 이 메소드를 호출
    public void publishTrigger(String orderStr, String topic) {
        detailActivity.mqttHandler().publishMessage(orderStr, topic);
    }

밑에 선언된 publishTrigger 메소드는 mAdapter로 생성된 UI스위치 리스너를 통해 호출되면 

detailActivity.mqttHandler().publishMessage(orderStr, topic);

이 부분이 정상작동됩니다 (break 포인트 위치한 for문 주석 처리할경우)

하지만 컴파일을 할경우 onCreate 부분에 break 포인트에서 에러가 발생하는데 방법을 못찾고 헤메고 있습니다. 저런식의 접근이 잘못되었다는건 알겠는데 어떻게 해결해야하는지 조언부탁드립니다 ㅠㅠ

02-03 03:55:03.937 12104-12104/kr.co.open_it.smart_world E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: kr.co.open_it.smart_world, PID: 12104
                                                                           java.lang.RuntimeException: Unable to start activity ComponentInfo{kr.co.open_it.smart_world/kr.co.open_it.smart_world.DetailActivity}: android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class fragment
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)

...
                                                                            Caused by: android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class fragment
                                                                            Caused by: android.view.InflateException: Binary XML file line #23: Error inflating class fragment
                                                                            Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void kr.co.open_it.smart_world.handler.MqttHandler.subscribeToTopic(java.lang.String, java.lang.String)' on a null object reference
                                                                               at kr.co.open_it.smart_world.fragment.RelayFragment.onCreateView(RelayFragment.java:51)
                                                                               ...

DetailActivity 위에 동시에 두개에 Fragment를 얹고 각프레그먼트에서 DetailActivity에 객체를 사용하려고 했는데요 값만 바뀌고 MqttAndroidClient (MqttHandler 내장 객체) 자체가 서비스로 manifest 파일에 선언을 해서 UI를 바꾸지 않기 때문에 계속 사용하려 했는데.. getset 메소드로 만들어 mTopic 변수에 접근해도 마찬가지더라구여 ㅠㅠ

참조된 객체의 값을 바꾸는건 안되는건가요?

만약 저런걸 진행하고 싶다면 어떻게 하는 방법이 좋을지 조언해주실수 있을까요?

부탁드립니다 ㅠㅠ

 

따블이 (260 포인트) 님이 2017년 2월 3일 질문
따블이님이 2017년 2월 3일 수정
어떤 mqtt라이브러리를 쓰시는지 알수 있을까요?

인터넷으로 찾아본 mqtt라이브러리와 많이 다르네요

http://www.java2s.com/Open-Source/Android_Free_Code/Example/sample/com_ibm_demo_IoTStarter_utilsMqttHandler_java.htm
제가 사용하는 MqttHandler는 MqttCallbackExtended 가 implements 되어 있구요
그래이들에서
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
    compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.0' 입니다

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...