ここでのポイントは、「このクラスを 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 をビジネス クラスのロジックから完全に切り離します。ここでは 1 つのタスクしか実行しませんが、それを拡張してより汎用的にし、新しいクラスを導入することなくより多くのことを実行するのは簡単です。