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界面 } }
新手水品,有任何问题,欢迎留言。