android多线程使用实例之AsynTask和handler的使用
2015-03-18 15:14
603 查看
在android开发当中,主线程(UI线程)是不允许处理复杂的耗时操作的,否则会导致UI线程阻塞,因此对此类操作应该使用子线程处理,一般会使用到AsyncTask异步任务和handler多线程来处理,并且在子线程中是不允许修改UI线程元素的,因此会使用到异步回调方法;下面例子通过AsyncTask和handler例子说明;
首先建立布局文件activity_main.xml,分别定义下载按钮和获取信息按钮
该例子是关于图片的,新建一个实体类Pic.java
回到MainActivity当中实现下载功能和图片信息获取功能:
最后不要忘了在AndroidManifest.xml当中添加访问网络的权限
实现效果:
首先建立布局文件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; @Override protected 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>{ @Override protected 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"/>
实现效果:
相关文章推荐
- 实例讲解Android多线程应用开发中Handler的使用
- 鱼鱼Chen之学写自己的apk(五)使用Handler完成Android里的多线程操作实例
- Android深入浅出系列之实例应用—程序运行进度提示条应用ProgressBar和Handler的使用
- Android-Socket多线程应用(聊天室客户端、Handler的简单使用)
- Android Handler使用实例
- 10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用
- android Handler详细使用方法实例
- Android多线程中使用Handler更新ListView控件数据
- Android多线程及异步任务消息处理机制(一)--Handler的使用
- android Handler详细使用方法实例
- android Handler详细使用方法实例
- Android开发之道(10)Handler本质简析与使用实例
- Android开发(12)--多线程处理机制之Handler的使用方法
- android handler runnable使用实例(关键是内部run中停止)
- android解决:使用多线程和Handler同步更新UI
- Android 开发之道(10)Handler本质简析与使用实例
- Android 多线程:使用Thread和Handler
- Android 多线程:使用Thread和Handler (从网络上获取图片)
- Android中的Handler与多线程应用实例
- android Handler详细使用方法实例