[Android] インターネット上の画像を表示する(Android4.0)

Android 2.3.3では動いてたコードが4.0で動かなかったので調べたら
4.x系から?外部画像(ネット上)を取得するには実行中のタスクとは別のタスクでやらないといけないらしい・・・

そこで今まで使ってたAsyncTaskを使おうとしたらこんな記事が
時代は AsyncTask より AsyncTaskLoader

なるほど、古い人間ですいませんorz

てことで新しい人間になってみました

まずは別タスクの処理をするクラスを作成

public class AppLoader extends AsyncTaskLoader<List<Bitmap>> 
{
    private final String[] urlStr;	// 画像のURL
    private List<Bitmap> bm;	// 出力用の宣言
	
    /**
     * コンストラクタ
     * 
     * @param context
     * @param imageArray
     */
    public AppLoader(Context context, String[] imageArray) {
        super(context);
        this.urlStr = imageArray;
    }
	
    /**
     * バックグラウンド処理を行う
     */
    @Override
    public List<Bitmap> loadInBackground() {
        bm = new ArrayList<Bitmap>();
        try {
            for(int i=0;i<urlStr.length ;++i){
                URL url = new URL(urlStr[i]);
                InputStream is = url.openStream();
                bm.add(BitmapFactory.decodeStream(is));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bm;
    }
}

これは最低限必要なメソッドのみを書いてるのでもっと拡張させることが出来ます

次にメインスレッドのActivity

//                                                               ※1
public class AsyncTaskLoaderActivity extends Activity implements LoaderCallbacks<List<Bitmap>> {
    private Context ctx;
    private ImageView Demo_Image01;
	
    /** テスト用画像 */
    private String image_uri[] = {"http://www.srv-shinra.com/d_Create/image/index.jpg"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.task_main);
        setTitle(this.getClass().getSimpleName());
 
        // Contextを指定
        ctx = AsyncTaskLoaderActivity.this;
        
        // レイアウト宣言
        Demo_Image01 = (ImageView)findViewById(R.id.demo_image01);
        
        // ※2
        // Activity復帰時のコールバック登録のため、必ず呼び出す
        // これが無いと動作しません
        getLoaderManager().initLoader(0, null, this);
    }

    // ※3
    // 最初に呼ばれるメソッド
    @Override
    public Loader<List<Bitmap>> onCreateLoader(int id, Bundle args) {
        AppLoader appLoader = new AppLoader(ctx,image_uri);

        appLoader.forceLoad();
        return appLoader;
    }

    // ※4
    // バックグラウンド処理が終わってから呼ばれるメソッド
    // 引数がloadInBackgroundメソッドの返り値となっている
    @Override
    public void onLoadFinished(Loader<List<Bitmap>> arg0, List<Bitmap> arg1) {
        for(int i=0; i<arg1.size(); ++i){
        	Demo_Image01.setImageBitmap(arg1.get(i));
        }
    }

    // 今回は使用しない
    @Override
    public void onLoaderReset(Loader<List<Bitmap>> arg0) {
		
    }
}

1.まずimplementsでLoaderCallbacksを実装
※今回はBitMapにしてますが各自必要なものを入れてください

2.getLoaderManager().initLoader(0, null, this)を実行
これが無いと始まりません
第一引数は0を入れていますがここは『0番のタスクが生成されているか』を確認するのですでに0がある場合処理を行いません
なので状況によって可変する必要がある場合は変数を入れて可変にするなりして対応してください

3.別タスクの処理をするクラスを呼び出す
この時引数に画像のURLを付与する
付与したURLを元に画像を引っ張ってきます

4.取得した画像データを出力する
あとは取得したデータをImageViewやらImageButtonやらに出力するだけです

これで一応問題は解決しましたー

This entry was posted in Android, Java, プログラミング関連, 備忘録 and tagged , . Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です