首先创建一个空的项目,添加一个java类,让它继承自AsyncTask,命名为MyAsyncTask,这个文件代码如下:
package com.example.hello; import android.os.AsyncTask; /** * Created by 联想 on 2016/6/28. */ public class MyAsyncTask extends AsyncTask<Void,Void,Void>{ @Override protected Void doInBackground(Void... voids) { return null; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } }这个类中主要是,实现了父类AsyncTask中的一下方法,其中
doInBackground 是在加载的时候执行,所有的异步操作的代码全部写在这里,各种操作。
onPreExecute() 实在doInBackGround之前执行,只要就行一些初始化的操作。
onPostExecute(Void aVoid) 在doinbackground之后执行,也就是在这个异步操作结束之前执行
onProgressUpdate doinbackground中需要修改主线程UI时,返回的参数就传到这个函数,这个函数再根据doinbackground传回来的参数,修改主线程中的UI。
然后创建一个Activity,命名为ImageTest,代码如下:
package com.example.hello; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.ProgressBar; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLConnection; import java.net.URL; /** * Created by 联想 on 2016/6/28. */ public class ImageTest extends Activity{ private ImageView mImageView; private ProgressBar mProgressBar; private static String URL = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1873573920,3766956019&fm=116&gp=0.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image); mImageView = (ImageView) findViewById(R.id.image); mProgressBar = (ProgressBar) findViewById(R.id.progressbar); //设置传递进去的参数 new MyAsyncTask().execute(URL); } class MyAsyncTask extends AsyncTask<String,Void,Bitmap> { @Override protected Bitmap doInBackground(String... strings) { String url = strings[0]; Bitmap bitmap = null; URLConnection connection; InputStream is; try { connection = new URL(url).openConnection(); is = connection.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); Thread.sleep(3000); //通过decodeStream解析输入流 bitmap = BitmapFactory.decodeStream(bis); is.close(); bis.close(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return bitmap; } @Override protected void onPreExecute() { super.onPreExecute(); mProgressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); mImageView.setImageBitmap(bitmap); mProgressBar.setVisibility(View.GONE); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } } }并编写这个Activity的布局文件,命名为:image,布局文件代码如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:padding="16dp" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" /> <ProgressBar android:id="@+id/progressbar" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"/> </RelativeLayout>,这个Acticity和这个布局的主要任务就是加载一张网络图片。
最后在MainActivity中通过一个Button按键,使用。
MainActivity代码如下
package com.example.hello; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyAsyncTask task = new MyAsyncTask(); task.execute(); } public void loadImage(View v) { startActivity(new Intent(this,ImageTest.class)); } }
他的布局文件 activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.hello.MainActivity"> <Button android:id="@+id/button" android:text="Image Test" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="loadImage"/> </LinearLayout>最后在AndroidManifest中声明添加的Antivity,ImageTest,和添加网络权限;
代码如下:
添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>声明Activity代码:
<activity android:name=".ImageTest"/>