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
- android多线程使用实例之AsynTask和handler的使用
- 简单AsynTask的使用实例
- Handler原理及AsynTask的使用
- android的service、handler、asyntask
- AsynTask的使用
- AsynTask的一些使用
- Android 多线程:使用Thread和Handler
- 鱼鱼Chen之学写自己的apk(五)使用Handler完成Android里的多线程操作实例
- Android之handler的使用
- android之Handler的使用
- Android之Handler的使用
- Handler和多线程以及openOptionsMenu的使用。
- handler的使用实例
- Android使用Handler实现多线程
- Android多线程及Handler使用
- Android 解决非UI线程操作UI的两种办法 :Handler 和 AsynTask
- Android中Handler使用实例
- Android面试之Handler的详细讲解和使用
- tomcat7启动报错
- Instant Client ODBC驱动安装步骤
- 像流水一样装着发行版
- 软件包 junit.framework 不存在的解决方法
- chromium中增加默认主题的一个方法
- android多线程使用实例之AsynTask和handler的使用
- 微信公众平台开发教程(五)自定义菜单
- map 通过迭代器 遍历
- java中判断传入的字符串是否是时间格式
- div层实现文字垂直显示
- linux内核编程
- OpenGL 喷泉效果部分解释
- ICMP协议
- 内连接、左外连接、右外连接、交叉连接区别