android的异步下载文件,即在非ui主线程之外,用新的线程下载mp3文件。达到ui主线程正常运行的状态下,异步下载文件。
考虑的实现方式有两种:1.在使用HandlerThread绑定handler,并在handler处理消息队列的(onhandlerMessage())方法中下载mp3文件,下边是代码。
public class Mp3ListActivity extends ListActivity {
private List<Map<String,String>> mplist=null;
private Handler handle=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mp3list);
Intent intent=getIntent();
List<Mp3Bean> list=(ArrayList<Mp3Bean>) intent.getSerializableExtra("list");
mplist=new ArrayList<Map<String,String>>();
Map<String,String> map=null;
for(Mp3Bean bean:list){
map=new HashMap<String,String>();
map.put("id", bean.getId());
map.put("name", bean.getName());
map.put("ip", bean.getIp());
System.out.println("id"+bean.getId()+"=====name:"+bean.getName());
mplist.add(map);
}
ListAdapter adapter=new SimpleAdapter(this, mplist, R.layout.mp3_item, new String[]{"id","name","ip"}, new int[]{R.id.id,R.id.name,R.id.ip});
setListAdapter(adapter);
HandlerThread thread=new HandlerThread("down");
thread.start();
handle=new MyHandler(thread.getLooper());
}
/*
* 列表被选中
*/
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Map<String,String> map=this.mplist.get(position);
Message msg=handle.obtainMessage();
msg.obj=map;
msg.sendToTarget();
//通过handlerThread来下载文件
}
private class MyHandler extends Handler{
public MyHandler(Looper looper) {
super(looper);
}
/* (non-Javadoc)
* @see android.os.Handler#handleMessage(android.os.Message)
*/
@Override
public void handleMessage(Message msg) {
Map<String,String> map=(Map<String, String>) msg.obj;
String urlStr=map.get("ip");
//在线程中下载文件
HttpDownUtil down=new HttpDownUtil(urlStr);
int a=down.downURLMp3("ova/", map.get("name"));
if(a==0){
Toast.makeText(Mp3ListActivity.this, "下载成功", Toast.LENGTH_LONG).show();
}else if(a==1){
Toast.makeText(Mp3ListActivity.this, "文件已经下载", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(Mp3ListActivity.this, "下载错误", Toast.LENGTH_LONG).show();
}
}
}
2.第二中实现方式是在service中启动新线程并用notification来通知用户更改ui界面的显示:
public class Mp3DownService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Bean bean=(Mp3Bean) intent.getSerializableExtra("bean");
//创建下载文件的线程
Thread t=new Thread(new DownThread(bean));
t.start();
return super.onStartCommand(intent, flags, startId);
}
private class DownThread implements Runnable{
Mp3Bean bean=null;
public DownThread(Mp3Bean bean){
this.bean=bean;
}
public void run() {
String mp3UrlStr="http://192.168.1.2:8888/download/"+bean.getMp3name();
HttpDown down=new HttpDown(mp3UrlStr);
int a=down.downMp3("ova/", bean.getMp3name());
String resault="";
if(a==0){
resault="文件下载成功!";
}else if(a==1){
resault="文件已经存在!";
}else{
resault="下载出错!";
}
//Notification来通知用户修改ui界面
}
}
新手水品,有任何问题,欢迎留言。
分享到:
相关推荐
Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 ...
android 异步下载图片AsycTask
android 图片异步下载,很实用。可以同时下载多张照片
采用异步下载方法,通过http协议获得输入流
Android AsyncTask异步处理下载网页
这是一个Android异步图片加载的例子
android解析豆瓣电影API的一个实例,涉及解析xml和异步下载图片,希望对初学者有帮助
提供AsyncTask的使用实例 并通过异步下载网络图片 包括New Thread的是引用 Handler的使用
Android 异步实现图片下载
android图片异步下载
本包里面内含三个压缩包,分别为异步下载,安装更新,等等
Android异步下载网络图片(其一) Android异步下载网络图片(其一) Android异步下载网络图片(其一) 源代码
Android异步操作数据库
android 异步操作框架 优秀的开源异步框架
使用Android Studio打开即可
这是一个关于异步操作,讲解onPreExecute,doInBackground等方法
对于Android的初学者来说,android的异步消息处理机制非常重要,本文档通过实例详细分析了消息处理机制
Android使用Thread异步下载图像
Android异步请求网络图片demo,博客地址:http://blog.csdn.net/yayun0516
android 异步下载图片(缓冲),mars老师视频代码