AsyncTask Demo小記

4744 ワード

今日はAsyncTaskが画像をダウンロードするdemoをして、ダウンロードした画像の歪みが歪んでいることを発見して、最初は画像の大きさやスクリーンの解像度の問題だと思っていましたが、後でByteArrayOutputStreamでデータを書く時に間違いを犯しました:baos.write(buffer); 変更後:baos.write(buffer, 0, len); 問題はありません.実はInputStreamis=responseです.getEntity().getContent();入力ストリームを取得するとバイト配列に変換することなくBitmapに変換でき、Bitmap bitMap=BitmapFactoryを呼び出すことができる.decodeStream(is);この方法でいいですが、この方法を直接呼び出すとダウンロードの進捗状況を計算できないようですか?
コードは次のとおりです.
package com.ylj.asynctask;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends ActionBarActivity implements OnClickListener
{

	private Button btn_download;
	private ImageView iv_picture;
	private ProgressDialog pDialog;
	private String path = "http://img8.zol.com.cn/bbs/upload/20688/20687324_0800.jpg";
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv_picture = (ImageView) findViewById(R.id.iv_picture);
		btn_download = (Button) findViewById(R.id.btn_download);
		btn_download.setOnClickListener(this);
	}
	@Override
	public void onClick(View v)
	{
		new DownloadTask().execute(path);
		
	}
	
	private class DownloadTask extends AsyncTask<String, Integer, Bitmap>{

		private Bitmap bitMap;

		@Override
		protected void onPreExecute()
		{
			pDialog = new ProgressDialog(MainActivity.this);
			pDialog.setTitle(" ");
			pDialog.setMessage(" , ...");
			pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			pDialog.setCancelable(false);
			pDialog.show();
			super.onPreExecute();
		}
		
		@Override
		protected Bitmap doInBackground(String... params)
		{
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(params[0]);
			try
			{
				HttpResponse response = client.execute(get);
				if(response.getStatusLine().getStatusCode() == 200){
					long length = response.getEntity().getContentLength();
					InputStream is = response.getEntity().getContent();
					byte[] buffer = new byte[1024];
					int len;
					int count = 0;
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
					while((len=is.read(buffer)) != -1){
						count += len;
						baos.write(buffer, 0, len);
						int progress = (int) (((float)count / (float)length) * 100);
						publishProgress(progress);
					}
					byte[] data = baos.toByteArray();
                                // byte[] buffer = EntityUtils.toByteArray(response.getEntity());
					bitMap = BitmapFactory.decodeByteArray(data, 0, data.length);
				//   InputStream bitmap
				//  bitMap = BitmapFactory.decodeStream(is);
				}
				
			}
			catch (ClientProtocolException e)
			{
				e.printStackTrace();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
			return bitMap;
		}
		
		@Override
		protected void onPostExecute(Bitmap result)
		{
			pDialog.dismiss();
			iv_picture.setImageBitmap(result);
			super.onPostExecute(result);
		}
		
		@Override
		protected void onProgressUpdate(Integer... values)
		{
			pDialog.setProgress(values[0]);
			super.onProgressUpdate(values);
		}
	}
}

レイアウト:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ylj.asynctask.MainActivity" >

    <ImageView  android:id="@+id/iv_picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"/>
    <Button
        android:id="@+id/btn_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="@string/download" />

</RelativeLayout>