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

static 함수와 non-static함수를 연결하는 방법이 없을까요?

0 추천

블루투스에서 값을 받아서, AsyncTask를 이용해 받은 그 값을 전송하려고 합니다.

블루투스쪽에서 값을 받아서,  MainActivity.onCharacteristicChanged(codeint);  로 codeint(받은값임)을 보내고

 

public static void onCharacteristicChanged(int value) 
			{
				[생략]
				else if (value == 31)
				{
					
					Message msg = mHandler.obtainMessage();
					msg.what = MESSAGE31;
					msg.obj = value;
					mHandler.sendMessage(msg);
				}	
			}

이런식으로 핸들러로 이동한 다음.

private final static Handler mHandler = new Handler() 
			{
	        public void handleMessage(Message msg) 
	        {
	            switch (msg.what) 
	            {
	            	case MESSAGE31:
	            	
	            		if(mContext!=null)
	            		{
	            			Toast.makeText(mContext, "값을 전송합니다.", Toast.LENGTH_SHORT).show();
	            			send_push();
	            		}
	            		break;
	 
	            	}
	        	}
			};

 

이런식으로 send_push()함수로 접근합니다.

public static void send_push()
	    {
	    	SendPostAsyncTask sendtask = new SendPostAsyncTask();
		sendtask.execute();
	    
	    }

 

모두다 static이다 보니, non-static인 SendPostAsyncTask에서 오류가 발생하네요.

 static으로 동일하게 적용해야 한다고.... 그렇다고 위의 함수들에서 static을 제외하고 맨 처음 블루투스 값을 

받는 부분에서 MainActivity.onCharacteristicChanged(codeint);  대신

new MainActivity.onCharacteristicChanged(codeint); 로 적용해보니 이것 역시 에러가 뜹니다.

Can't create handler inside thread that has not called Looper.prepare()

구글링해보니 스레드안에서 스레드를 사용했다는데....어떤식으로 변경해야하는지..;; 조언 부탁드립니다.

긴 글 읽어주셔서 감사합니다

 

 

 

anci (19,950 포인트) 님이 2015년 1월 15일 질문
굳이 핸들러로 던졌다가 AsyncTask를 다시 호출할 필요가 있나요?

onCharacteristicChanged 에서 곧바로  
SendPostAsyncTask sendtask = new SendPostAsyncTask();
sendtask.execute();
이렇게 하시면 될것 같은데..
이분의 경우 onCharacteristicChanged 가 static으로 선언되어 동일한 문제가 발생할것 같네요 ^^;

1개의 답변

+3 추천
 
채택된 답변
http://stackoverflow.com/questions/2042813/calling-non-static-method-in-static-method-in-java

그러나 질문자님의 경우 static을 사용할 필요가 있는지 근본부터 검토 하시는 게 좋을 것 같네요.

아래 개념에 대해 잘 설명한 사이트가 있어 첨부합니다.

http://rockdrumy.tistory.com/214
세기말소년 (3,280 포인트) 님이 2015년 1월 15일 답변
anci님이 2015년 1월 15일 채택됨
답변 감사합니다. 맨 처음 함수인 onCharacteristicChanged을 불러오는 부분이 블루투스 값을 받아오는 public void onCharacteristicChanged(BluetoothGatt gatt,
                BluetoothGattCharacteristic characteristic)  부분입니다.

byte[] data= null;
            data = characteristic.getValue();
.
.
.
이러쿵 저러쿵 해서 최종적으로 받아온 값을 codeint로 가공했습니다.
new MainActivity().onCharacteristicChanged(codeint); //main에 있는 함수
static으로 사용하지 않기 위해 위와같은 식으로 했지만
Can't create handler inside thread that has not called Looper.prepare() 에러가 발생했구요..애초에 블루투스 값을 가져올 때 static 함수를 써야하는건지...
공홈과 구글링으로 작성한거라 정확한 원인을 모르겠습니다 ㅠ
제가 코드를 전부 보진 못하기 때문에 뭐라 확실한 답변을 드리진 못하겠지만, 일단 질문자님의 경우 굳이 static을 사용할 필요가 없어보이구요.

블루투스로 받아온 데이터는 Message의 object에 셋팅하셔서 사용하시면 될 것 같습니다.

두번째 문제, Can't create handler inside thread that has not called Looper.prepare()
AsyncTask 클래스 안에서 핸들러를 사용하셔서 발생하는 문제 같은데요.. 이 경우에도 이 에러메세지를 해결할 방법을 알려드릴 수는 있습니다. Handler 객체를 만들 때 인자에 getMainLooper()를 넣어주시면 동일한 메세지는 발생하지 않을 겁니다만,

이 경우에도 핸들러를 사용할 지 AsynTask를 사용할지 결정하고 사용하시는 걸 권장합니다.

핸들러를 사용할 때 파라미터를 보내실꺼면 object에 셋팅하시구요, AsyncTask를 사용하실 꺼면 클래스에서 교화할 인자를 정의하시구요.

마지막으로 조언을 하나 드리자면,
문제가 발생하면 그 문제에만 집중하시는 게 좋습니다. ^^;; 문제의 근원을 도외시 한체 그 문제를 회피하려다가 새로운 문제가 계속 발생하다 보면 소위 말하는 '멘붕'에 빠지기 쉽거든요.

그럼 즐거운 개발 하십시오.
장문 답변 정말 감사합니다 ㅠㅠ
일단 근본적인 문제부터 해결하려고 ~ 맨 처음에 발생한 오류만 집중해서 수정하고 있습니다. 정말 감사합니다!! 조언 가슴에 새기고 명심하겠습니다.(__) 좋은하루 보내세요!
...