Các bạn có thể cải tiến thêm về cách chọn link hình.. Bài demo của mình được làm theo các bước sau: 1/ Tạo 1 Project : Project name: AsyncTaskDemo Build Target: Android 2.3.3 Application
Trang 1TẢI HÌNH TỪ INTERNET
Sau đây mình sẽ làm 1 demo trình bày cách thức download 1 tấm hình từ Internet Do tính chất của demo nên mình thêm trực tiếp link của hình vào phần code Các bạn có thể cải tiến thêm về cách chọn link hình Bài demo của mình được làm theo các bước sau:
1/ Tạo 1 Project :
Project name: AsyncTaskDemo
Build Target: Android 2.3.3
Application name: AsyncTaskDemo
Package name: com.dac AsyncTaskDemo
Create Activity: HttpActivity.java
2/ Tiếp theo các bạn thiết kế giao diện như sau:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button android:id="@+id/button" android:text="Get Image"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="doClick"
/>
<TextView android:id="@+id/text"
android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
<TextView android:id="@+id/errorMsg"
android:layout_width="wrap_content" android:layout_height="wrap_content" />
<ImageView android:id="@+id/image"
android:layout_width="fill_parent" android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
Trang 23/ Tiếp theo các bạn tạo 1 class CustomHttpClient.java trong package chính và viết code như sau:
package com.dac.AsyncTaskDemo
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
public class CustomHttpClient {
private static HttpClient customHttpClient;
private CustomHttpClient() {
}
public static synchronized HttpClient getHttpClient() {
if (customHttpClient == null) { HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,
HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
ConnManagerParams.setTimeout(params, 1000);
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 10000);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http",
PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https",
SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new
ThreadSafeClientConnManager(params,schReg);
customHttpClient = new DefaultHttpClient(conMgr, params);
}
Trang 3return customHttpClient;
}
}
4/ Sau đó các bạn tạo tiếp class DownloadImageTask.java trong package chính để thực hiện việc download:
package com.dac.AsyncTaskDemo
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
public class DownloadImageTask extends AsyncTask<String, Integer, Bitmap> {
private Context mContext;
DownloadImageTask(Context context) {
mContext = context;
}
protected void onPreExecute() {
}
protected Bitmap doInBackground(String urls) {
Log.v("doInBackground", "doing download of image");
return downloadImage(urls);
}
protected void onProgressUpdate(Integer progress) {
TextView mText = (TextView) ((Activity) mContext).findViewById(R.id.text); mText.setText("Progress so far: " + progress[0]);
}
protected void onPostExecute(Bitmap result) {
Trang 4if(result != null) {
ImageView mImage = (ImageView) ((Activity)
mContext).findViewById(R.id.image);
mImage.setImageBitmap(result);
else {
TextView errorMsg = (TextView) ((Activity)
mContext).findViewById(R.id.errorMsg);
errorMsg.setText("Problem downloading image Please try again later.");
}
private Bitmap downloadImage(String urls)
{
HttpClient httpClient = CustomHttpClient.getHttpClient();
try {
HttpGet request = new HttpGet(urls[0]);
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setSoTimeout(params, 60000);
request.setParams(params);
publishProgress(25);
HttpResponse response = httpClient.execute(request);
publishProgress(50);
byte[] image = EntityUtils.toByteArray(response.getEntity());
publishProgress(75);
Bitmap mBitmap = BitmapFactory.decodeByteArray(image, 0, image.length); publishProgress(100);
return mBitmap;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
5/ Cuối cùng các bạn viết code trong file Activity chính như sau:
package com.dac.AsyncTaskDemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
Trang 5import android.view.View;
public class HttpActivity extends Activity {
private DownloadImageTask diTask;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void doClick(View view) {
if(diTask != null) {
AsyncTask.Status diStatus = diTask.getStatus();
Log.v("doClick", "diTask status is " + diStatus);
if(diStatus != AsyncTask.Status.FINISHED) {
Log.v("doClick", " no need to start a new task");
return;
diTask = new DownloadImageTask(this);
//Link cua minh
diTask.execute("http://i1133.photobucket.com/albums/m592/Nobilomo1/cscom.jpg")
;
}
}
Và khi hoàn thành các bạn nhớ phải khai báo cho ứng dụng được phép truy cập
internet trong file AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dac.AsyncTaskDemo"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HttpActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
Trang 6Khi debug các bạn bấm vào button trên màn hình và đợi ứng dụng tải (có thể hiện số % tải được) và xem kết quả :
Mọi ý kiến đóng góp các bạn vui lòng gữi bài viết về forum
http://forum.laptrinhdidong.vn/ Rất mong nhận được phản hồi của các bạn.