콜백을 사용하세요.
public interface WeatherListener {
void onSuccess(String temperatrue);
void onError(Exception e);
}
// 액티비티나 프레그먼트에서 라이프사이클에 따라 리스너를 등록/헤제해주어야 하기 때문에
// 간단한 wrapper클래스가 하나 필요할 것 같습니다.
public class WeatherManager {
private WeatherListener listener;
public void setListener(WeatherListener listener) {
this.listener = listener;
}
public void fetchTemperature() {
WeatherThread weatherThread = nw WeatherThread(listener);
weatherThread.run();
}
}
public class WeatherThread extends Thread {
private WeatherListener listener;
public WeatherThread(WeatherListener listener) {
this.listener = listener;
}
...
@Override
public void run() {
try {
...
if (listener != null) listener.onSuccess(tem);
} catch (Exception e) {
if (listener != null) listener.onError(e);
}
}
}
위에서 리스너가 백그라운드 쓰레드에서 호출되기 때문에 화면을 업데이트하려면 호출한 쪽의 리스너의 메소드 처리는 메인쓰레드에서 호출해야 합니다.
public class WeatherActivity extends AppCompatActivity implements WeatherListener {
private WeatherManager weatherManager;
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState);
weatherManager = new WeatherManager();
button.setOnClickListener{v -> {
weatherManager.fetchTemperature();
});
}
override fun onStart() {
super.onStart()
weatherManager.setListener(this);
}
override fun onStop() {
super.onStop()
weatherManager.setListener(null)'
}
@Override
public void onSuccess(String temperature) {
runOnUiThread(...)
}
@Override
public void onError(Exception e) {
runOnUiThread(...)
}
}
runOnUiThread: https://developer.android.com/reference/android/app/Activity#runOnUiThread(java.lang.Runnable)
테스트는 안된 코드이긴 하지만, 콜백을 등록하고 메세지를 주고 받는 다은 부분이 핵심입니다.콜백은 사용 후 해제하면 되구요.