1.activity_main.xml
<LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下载" /> <ImageView android:id="@+id/iv" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>View Code
2.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.anjoyo.a12_usingasynctask" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.anjoyo.a12_usingasynctask.MainActivity" 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> </manifest>View Code
3.MainActivity.java
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity implements OnClickListener { private Button btn; private ImageView iv; private String urlStr = "http://bgimg1.meimei22.com/recpic/2013/27.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn); iv = (ImageView) findViewById(R.id.iv); btn.setOnClickListener(this); } @Override public void onClick(View v) { MyTask task = new MyTask(iv); task.execute(urlStr);//启动该task } }View Code
2.自定义MyAsyncTask
MyAsyncTast.java:
import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; import android.widget.ImageView; /** * * 1、Params: * 启动任务时传入的参数,该参数一般为资源或链接的url地址,所以该参数多为String类型参数 * doInBackground方法的传入参数 * * 2、Progress * onProgressUpdate方法的传入参数(如果publishProgress方法不调用,则该方法不会被回调) * publishProgress方法的参数 * * 3、Result * doInBackground方法的返回值类型 * onPostExcute方法的传入参数 * * * ps: 1、AsyncTask不能直接使用,只能将其子类化进行使用 * 2、一个AsyncTask的实例只能启动一次 * * @author Anjoyo * */ public class MyTask extends AsyncTask<String, Integer, Bitmap> {//AsyncTask是Android当中的异步机制, //也称之为异步任务,也称之为Android当中多线程的使用 private ImageView iv; Bitmap bitmap ; public MyTask(ImageView iv) { System.out.println("MyTask----------->MyTask"); this.iv = iv; } @Override protected void onPreExecute() {//该方法在主线程当中被调用 /* * 该方法在执行实际的后台操作时被UI线程调用,可以在该方法中做一些准备工作,比如 * Toast.makeText(context, "准备下载", Toast.LENGTH_LONG).show(); */ Log.v("MyTask", "onPreExecute"); super.onPreExecute(); } @Override protected Bitmap doInBackground(String... params) {//该方法在后台(子线程)当中被调用 /输入编变长的可变参数 和UI线程中的Asyna.execute()对应 /** * 该方法在OnpreExecute执行以后马上执行,该方法执行在后台线程当中,负责耗时的计算, * 可以调用publishProcess方法来实时更新任务进度 * */ Log.v("MyTask", "doInBackground"); try { URL url = new URL(params[0]); URLConnection conn = url.openConnection(); bitmap = BitmapFactory.decodeStream(conn.getInputStream()); publishProgress(1); return bitmap; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(Integer... values) {//该方法在主线程当中被回调 super.onProgressUpdate(values); /** * 当publishProgress 被调用以后,UI线程将调用这个有方法在界面上展示任务的情况,比如一个进度条。这里是更新进度条 */ Log.v("MyTask", "onProgressUpdate"); } @Override protected void onPostExecute(Bitmap result) {//该方法在主线程当中被回调 super.onPostExecute(result); //在doInbackground执行完成以后,onPostExecute将被调用,后台的结果将返回给UI线程,将获得图片显示出来 Log.v("MyTask", "onPostExecute"); System.out.println("MyTask----------->onPostExecute"); if (result != null) { iv.setImageBitmap(result); } } }View Code
代码中均有注释,注意在AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.INTERNET" />
转载于:https://www.cnblogs.com/guoxinglei/p/Enjoy_Table.html