본문 바로가기

PROGRAMING/Android

thread를 돌려서 callback으로 데이터 얻어오기

안드로이드에서 JB에서 네트워크에 접속하여 데이터를 얻어오는 로직을 넣을 경우 쓰레드로 하지 않으면
컴파일 에러를 발생시킨다.
쓰레드를 사용한 예제를 만들어 보았다.

요구사항은 다음과 같다.
1. android에서만 사용되지만 해당 java class파일은 jar로 묶을수 있어야 한다.(결합도가 낮아야한다.)

방법 Interface를 사용해서 결합도를 낮췄고 android의 Handler 개체를 써서 UI Thread에 결과값이 받아지도록 했다.

Activity

public class MainActivity extends Activity  implements Test2.ThreadRecevie{

public String CLASSNAME = "MainActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i(CLASSNAME,"onCreate Thread.currentThread().getName() : "+Thread.currentThread().getName());

Test2 test2 = new Test2(this,"구글");

test2.start();

}

@Override

public void onReceiveRun(final String tmp) {

Log.i(CLASSNAME,"onReceiveRun1 : "+tmp);

Log.i(CLASSNAME,"onReceiveRun Thread.currentThread().getName() : "+Thread.currentThread().getName());

}

}




쓰레드

public class Test2 extends Thread {

Handler mHandler = new Handler();

ThreadRecevie mThreadRecevie;

private String CLASSNAME="Test2"; 

private String mUrl;

public interface ThreadRecevie{

public void onReceiveRun(String tmp);

}

public Test2(ThreadRecevie threadRecevie,String url) {

mThreadRecevie = threadRecevie;

mUrl = url;

}

@Override

public void run() {

super.run();

/*  이부분에 쓰레드에서 하는 네트워크 처리를 넣어준다.*/

Log.i(CLASSNAME,"run");

Log.i(CLASSNAME,"run Thread.currentThread().getName() : "+Thread.currentThread().getName());

mHandler.post(new Runnable() {

@Override

public void run() {

mThreadRecevie.onReceiveRun(mUrl+"가나다라마");   //참조된 ThreadRecevie객체의 onReceiveRun함수를 호출

}

});

//mThreadRecevie.onReceiveRun(mUrl+"가나다라마");

}

}



예제 첨부

extraApi.zip