SQLの窓

2016年06月15日


AsyncTask<Params, Progress, Result> の Progress を無しにして、onPostExecute 内の処理を interface を使って MainActivity 側で実行できるようにするクラスの作成と実行 : ジェネリクスの継承

通常使うのが、doInBackground で、その戻り値が UI スレッドで実行できればいい、と言うことを大目的としたクラスです。

UI スレッドに処理を投げる為に、専用の execute メソッドほもう一つ作って、そこの第一引数にイベントとしてインターフェイスを使うようにしています。

doInBackground は、Override される事が前提なので、なにもしていません。

StdAsyncTask
package lightbox.june.loadimage;

import android.os.AsyncTask;

public class StdAsyncTask<Params, Result> extends AsyncTask<Params, Void, Result> {

	UiAction<Result> ua = null;

	public interface UiAction<Result> {
		public void actUiAction(Result result);
	}

	public void execute(UiAction<Result> ua, Params... params) {
		this.ua = ua;
		this.execute(params);
	}

	@Override
	protected Result doInBackground(Params... params) {
		return null;
	}

	@Override
	protected void onPostExecute(Result result) {
		if( ua != null ) {
			ua.actUiAction(result);
		}
	}

}

AsyncTask の 二番目の 仮型引数 を Void にして、継承したほうでは必要無いようにしています。

そして、これをこのまま使ってもいいのですが、Drawable のデータを取得するという目的に特化した、StdAsyncTask を継承した HttpDrawable クラスが以下になります。
package lightbox.june.loadimage;

import android.graphics.drawable.Drawable;
import android.util.Log;

import java.io.InputStream;
import java.net.URL;

public class HttpDrawable extends StdAsyncTask<String,Drawable> {

	@Override
	protected Drawable doInBackground(String... params) {

		Drawable image = null;
		try {
			// インターネット上の画像を取得して、Drawable に変換
			URL url = new URL((String) params[0]);
			InputStream is = (InputStream)url.getContent();
			image = Drawable.createFromStream(is, "");
			is.close();
		}
		catch(Exception e) {
			Log.i("button", "インターネットのアクセスでエラーが発生しました");
		}
		return image;
	}

}


実行は、URL を用意して、イベント処理で画面の処理を行うのみとなります。
package lightbox.june.loadimage;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				String url = "http://news.biglobe.ne.jp/img/blnews/animal160128_02.jpg";
				HttpDrawable hd = new HttpDrawable();
				hd.execute(new StdAsyncTask.UiAction<Drawable>() {
					@Override
					public void actUiAction(Drawable drawable) {

						ImageView iv = (ImageView) MainActivity.this.findViewById(R.id.imageView);
						if ( drawable != null ) {
							iv.setImageDrawable(drawable);
						}

					}
				},url);

			}
		});
	}
}



【2 Android Studioの最新記事】
posted by lightbox at 2016-06-15 21:53 | 2 Android Studio | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり