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>