android异步下载mp3文件

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界面
		}
		
	}
 

新手水品,有任何问题,欢迎留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用多线程和异步任务来实现异步下载文件的功能。以下是一种常见的实现方式: 1. 使用Java的URL类来创建一个指向要下载文件的URL对象。 2. 创建一个Runnable对象来执行下载操作。在该对象的run()方法中,使用InputStream和OutputStream类来读取和写入文件。 3. 使用ExecutorService类创建一个线程池,并将Runnable对象提交给线程池执行。 4. 使用Future对象来获取异步下载任务的状态和结果。 下面是一个简单的示例代码: ```java import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class FileDownloader { public static void main(String[] args) { String fileUrl = "https://example.com/example.txt"; String filePath = "path/to/save/file.txt"; ExecutorService executor = Executors.newSingleThreadExecutor(); Future<?> future = executor.submit(() -> { try (InputStream in = new URL(fileUrl).openStream(); OutputStream out = new FileOutputStream(filePath)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } catch (Exception e) { e.printStackTrace(); } }); // 可以在这里执行其他的任务 try { // 等待异步下载任务完成 future.get(); System.out.println("文件下载完成!"); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } } ``` 这段代码会创建一个线程池,并通过submit()方法提交一个Runnable对象执行下载任务。可以在异步下载任务执行的同时执行其他任务。最后,使用future.get()方法来等待异步下载任务完成,并打印下载完成的提示信息。 请注意,这只是一个简单的示例代码,实际开发中可能还需要处理异常、添加下载进度等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值