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

mainActivity 에서 Activity를 extend 하고있는 다른 class 내 함수 불러오기

0 추천
public class DeviceControlActivity extends Activity

위의 class 내의 함수에서 (onCreate에서 실행 X) 

public class Main_SMS extends Activity

에 있는 함수를 호출하려고 하는데 에러가 납니다.

Main_SMS 내에서  

public static Context mContext;
mContext = this;

선언을 해주고 

DeviceControlActivity 내에서 

((Main_SMS)Main_SMS.mContext).sendSMS();
((Main_SMS) mContext).sendSMS();

두 경우 위와 같이 설정을 하였는데 에러가 났습니다.

 

sendSMS()는 아래와 같습니다.

사실 sendSMS내의 내용은 버튼이벤트가 발생하였을때 실행되는 내용인데

버튼함수의 경우 함수 인자로 View v 로 보내게 되어있어 DeviceControlActivity 내에서 실행시킬 방법을 찾지못하여 인자가 없는 함수를  새로 만들었습니다.

public void sendSMS(){
    String smsNum = smsNumber.getText().toString();
    String smsText = smsTextContext.getText().toString();

    if (smsNum.length()>0 && smsText.length()>0){
        sendSMS(smsNum, smsText);
    }else{
        Toast.makeText(this, "모두 입력해 주세요", Toast.LENGTH_SHORT).show();
    }
}

 

sendSMS()함수 내에서 실행하는 sendSMS(smsNum,smsText)는 Main_SMS 내에서 설정되어 있습니다.

 

위 함수 실행시 에러코드입니다

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.android.bluetoothlegatt, PID: 14407
                  java.lang.RuntimeException: Error receiving broadcast Intent { act=com.example.bluetooth.le.ACTION_DATA_AVAILABLE flg=0x10 (has extras) } in com.example.android.bluetoothlegatt.DeviceControlActivity$2@1acc0636
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:933)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:145)
                      at android.app.ActivityThread.main(ActivityThread.java:5951)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.android.bluetoothlegatt.Main_SMS.sendSMS()' on a null object reference
                      at com.example.android.bluetoothlegatt.DeviceControlActivity$2.onReceive(DeviceControlActivity.java:134)
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:923)
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:5951) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

 

 

colin0720 (120 포인트) 님이 2016년 11월 15일 질문

1개의 답변

0 추천
흔하디 흔한 null포인터 에러네요.

Activity에서 다른 Activity의 함수를 호출한다면 분명 해당 Activity의 생명주기에 영향을 주는 상태에서 함수 호출이 이루어 질텐데

sendSMS 함수상에서 Edit 인스턴스를 참조 하도록 되어 있네요.

Activity가 뒤로 가게 되면 Activity Manager 로부터 LMK(Low Memory Killer)의 대상이 됩니다.

그럼 destroy 상태가 될텐데 이때 create 되었던 view들도 초기화가 될것이고 그렇게 되면 위같은 에러가 발생할 수 있습니다.
Development Guy (70,570 포인트) 님이 2016년 11월 15일 답변
그럼 어떤식으로 해결해야 할까요?
해결방법을 잘 모르겠어 가지고 ...
DeviceControlActivity의 메인화면에서 화면전환없이 다른 activity의 함수를 호출하여 이벤트를 발생하고 싶습니다.

DeviceControlActivity 내에서 sendSMS 를 intent로 호출하고

sendSMS  내 onCreat에서  setContentView를 DeviceControlActivity의 main xml로 설정해면 될까요 ?
otto event bus 혹은
broadcast 방식을 이용하시면 됩니다.
...