android多线程使用实例之AsynTask和handler的使用

来源:互联网 发布:斑马旅游 知乎 编辑:程序博客网 时间:2024/06/07 00:02

在android开发当中,主线程(UI线程)是不允许处理复杂的耗时操作的,否则会导致UI线程阻塞,因此对此类操作应该使用子线程处理,一般会使用到AsyncTask异步任务和handler多线程来处理,并且在子线程中是不允许修改UI线程元素的,因此会使用到异步回调方法;下面例子通过AsyncTask和handler例子说明;


首先建立布局文件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="com.example.picdown.MainActivity" ><ImageView     android:id="@+id/iv"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    /><Button    android:id="@+id/btn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:text="下载" /><Button     android:id="@+id/testbtn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:text="测试线程"    /></LinearLayout>

该例子是关于图片的,新建一个实体类Pic.java


package com.example.picdown;public class Pic {private String name;private String url;private String type;Pic(String name,String url,String type){setName(name);setUrl(url);setType(type);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getType() {return type;}public void setType(String type) {this.type = type;}}


回到MainActivity当中实现下载功能和图片信息获取功能:


package com.example.picdown;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.animation.ArgbEvaluator;import android.app.Activity;import android.app.ProgressDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnCancelListener;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener{    private Button btn,testbtn;    private ImageView iv;    private ProgressDialog mProgressDialog;    private DownloadAsyncTask mTask;    private static final String PATH = "http://www.baidu.com/img/bdlogo.png";    private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}public void initView(){btn =(Button) findViewById(R.id.btn);testbtn=(Button) findViewById(R.id.testbtn);iv=(ImageView) findViewById(R.id.iv);btn.setOnClickListener(this);testbtn.setOnClickListener(this);    //初始化handler对象                handler =new Handler(){        @Override        public void handleMessage(Message msg) {        if(msg.what==1){        Pic pic =(Pic) msg.obj;        String name =pic.getName();        String url= pic.getUrl();        String type =pic.getType();        System.out.println("图片名:"+name+";图片地址:"+url+";图片类型:"+type);        Toast.makeText(getApplicationContext(), "图片名:"+name+";图片地址:"+url+";图片类型:"+type, Toast.LENGTH_SHORT).show();        }        }        };}public void onClick(View v) {switch (v.getId()) {case R.id.btn:downImg();break;case R.id.testbtn:new Thread(new Runnable(){public void run() {Pic pics =new Pic("百度logo",PATH,"jpg图片");Message msg =handler.obtainMessage();msg.what=1;msg.obj=pics;handler.sendMessage(msg);}}).start();break;}                }private void  downImg(){// 执行异步线程        mTask = new DownloadAsyncTask();        mTask.execute(PATH);}private class DownloadAsyncTask extends AsyncTask<String, Integer, Bitmap>{@Overrideprotected Bitmap doInBackground(String... params) {Bitmap bitmap =null;try{URL url = new URL(params[0]);HttpURLConnection con =(HttpURLConnection) url.openConnection();con.setDoInput(true);con.connect();InputStream inputstream =con.getInputStream();bitmap=BitmapFactory.decodeStream(inputstream);inputstream.close();}catch(Exception e){e.printStackTrace();}return bitmap;}        @Override        protected void onPostExecute(Bitmap result) {        super.onPostExecute(result);        iv.setImageBitmap(result);//设置图片                }}}

最后不要忘了在AndroidManifest.xml当中添加访问网络的权限

 <uses-permission android:name="android.permission.INTERNET"/>



实现效果:






0 0