AsyncTask下载图片

最近在看一个非常早期曾经写过代码,装上去召回。本文首先召回AsyncTask的基本使用.   AsyncTask说简单点就是 开启一个线程。而且把结果提交给ui线程。

Thread+Handler,只是里面做了一些封装 减轻了我们维护线程的麻烦。

先来写一个简单的样例,异步下载一个图片,显示到ImageView中。


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new MyTask().execute("http://www.baidu.com/img/bdlogo.png");//下载一个baidu的logo
    }

    //第一个參数的须要处理的数据,第二个參数是进度值。第三个參数是处理结果的类型


    public class MyTask extends AsyncTask<String,Integer,Bitmap> {
    	

		@Override
		protected void onPostExecute(Bitmap result) {
			Log.d("", "onPostExecute");
			 updateImageView(result);
		}

		@Override
		protected void onPreExecute() {
			Log.d("", "onPreExecute");
		}

		@Override
		protected Bitmap doInBackground(String... args) {
			String website = args[0];
			HttpURLConnection conn = null;
			InputStream ins = null;
			try {
				URL url = new URL(website);
				conn = (HttpURLConnection) url.openConnection();
				conn.setConnectTimeout(5000);
				conn.setDoInput(true);
				if (conn.getResponseCode() == 200) {
					Log.d("", "get image is ok");
					ins = conn.getInputStream();
					return BitmapFactory.decodeStream(ins);
				}
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (ins != null) {
					try {
						ins.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
			return null;
		}
    	
    }

  
	public void updateImageView(Bitmap result) {
		if (result != null) {
			ImageView img = (ImageView) findViewById(R.id.img);
			img.setImageBitmap(result);
			
		
		}
		
	}


}


onProgressUpdate这里没有写 是更新进度值的。通过调用publishProgress


注意事项:不能在线程中 new AsyncTask 仅仅能在ui线程中使用。不能在一个对象上调用2次execute方法,仅仅能用一次

下一篇将具体解破AsyncTask源代码。 若有问题。请指出 谢谢。




版权声明:本文博主原创文章,博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/gcczhongduan/p/4915390.html