요점은 "이 클래스 양식을 UI 스레드로 사용할 수 없다"는 점입니다. 그런 다음 AsyncTask를 만듭니다. 서비스를 받고 거기에서 API 메소드를 호출하고 싶다면 어떻게해야할까요? AsyncTask는 서비스 스레드에서 호출 할 수 없습니다.
나는이 클래스를 그대로두고 UI에서 호출하려고 할 때 AsyncTask에 래핑합니다.
편집 : 당신은 AsyncTask를 호출하고 결과가 준비되면 콜백을 얻을 수 있습니다, 지금
private class GetAuthorisationUrlTask extends AsyncTask<String, Void, String>
{
private OAuthBuilder oAuthBuilder;
private GetAuthorisationUrlTaskCallback callback;
public GetAuthorisationUrlTask(Context context, OAuthBuilder oAuthBuilder, GetAuthorisationUrlTaskCallback callback)
{
this.oAuthBuilder = oAuthBuilder;
this.callback = callback;
}
@Override
protected String doInBackground(String... params)
{
try
{
Log.i(TAG, "Getting authorization url...");
return oAuthBuilder.getAuthorizationUrl();
}
catch (Exception e)
{
Log.e(TAG, "Unable to get OAuth authorization url: " + e, e);
return null;
}
}
@Override
protected void onPostExecute(String result)
{
Log.i(TAG, "Authorisation url: " + result);
if (result == null)
Toast.makeText(getApplicationContext(), "Error getting authorization url.", Toast.LENGTH_SHORT).show();
else
callback.urlCreated(result);
}
static interface GetAuthorisationUrlTaskCallback
{
void urlCreated(String url);
}
}
: 이것은 AsyncTask를로 기존의 기능을 포장의 예입니다.
GetAuthorisationUrlTask getAuthorisationUrlTask = new GetAuthorisationUrlTask(this,
new GetAuthorisationUrlTaskCallback()
{
@Override
public void urlCreated(String url)
{
webview.loadUrl(url);
}
});
getAuthorisationUrlTask.execute();
내가 너무 보일러 플레이트 코드가 알고 있지만, 그것은 당신의 비즈니스 클래스의 논리에서 완전히 UI를 분리합니다. 여기서는 단 하나의 작업 만 수행하지만 새로운 클래스를 추가하지 않고 더 일반적으로 확장하고 더 많은 작업을 수행하는 것은 쉽습니다.
하지만 어떻게'fetchRemoteData()'를 async라고하고 싶을까? 귀하의 예제는 기본적으로 내가 한 일이지만'NetworkOnMainThreadException'을 피하기 위해'http : // new Thread()'에 http 로직을 넣었다. – Ron
@Ron 당신은 그렇게 구현한다. 업데이트 된 답변. –
감사합니다! 나는 그것에게 시도를 줄 것이고, 나의 진도에 당신을 최신이라고 유지할 것이다 :) – Ron