Android回调函数理解
Android回调函数理解,比如我用一个activity去做显示下载进度的一个进度条,但是下载是另外一个B类来做的,这个时候我Activity获取下载的进度就可以提供一个回调接口,然后让下载类来回调就行了
Activity端
package com.Javen;import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;public class HttpGetDemoActivity extends Activity
{/** Called when the activity is first created. */private EditText editText = null;private Button download,delete,onlinPlay,stop = null;private ProgressBar progressBar= null;private SeekBar seekBar = null;private TextView resultText = null;private static final String TAG = "HttpGetDemoActivity";private static final int SHOW_PROGRESSBAR = 111;private DownloadTask task = null; /* 下载类 */private Downloader downloader = null;/* 音乐播放类 */private MusicPlayer musicPlayer = null;private File downfile = null;private String filename = null;private String pathtext = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);findView();pathtext = editText.getText().toString();downloader = new Downloader();musicPlayer = new MusicPlayer(seekBar);}private void findView(){editText = (EditText)findViewById(R.id.edit);download = (Button)findViewById(R.id.download);delete = (Button)findViewById(R.id.delete);onlinPlay = (Button)findViewById(R.id.onlinePlay);stop = (Button)findViewById(R.id.stop);seekBar = (SeekBar)findViewById(R.id.seekBar);progressBar = (ProgressBar)findViewById(R.id.progreeBar);resultText = (TextView)findViewById(R.id.result);ButtonClickListener clickListener = new ButtonClickListener();SeekBarChangeEvent seekBarChangeEvent = new SeekBarChangeEvent();download.setOnClickListener(clickListener);delete.setOnClickListener(clickListener);onlinPlay.setOnClickListener(clickListener);stop.setOnClickListener(clickListener);seekBar.setOnSeekBarChangeListener(seekBarChangeEvent);}private final class ButtonClickListener implements OnClickListener{@Overridepublic void onClick(View v){// TODO Auto-generated method stubswitch (v.getId()){case R.id.download:// http://abv.cn/music/光辉岁月.mp3,可以换成其他文件下载的链接filename = pathtext.substring(pathtext.lastIndexOf("/")+1);
// try{
// //将中文转为UTF-8进行编码
// filename = URLEncoder.encode(filename, "UTF-8");
// } catch (UnsupportedEncodingException e){
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// pathtext = pathtext.substring(0, pathtext.lastIndexOf("/")+1)+filename;if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File savDir = Environment.getExternalStorageDirectory();downfile = new File(savDir, filename);downLoad(pathtext, downfile);}else{Toast.makeText(getApplicationContext(), "未插入SD卡", Toast.LENGTH_LONG).show();}break;case R.id.delete:if(downfile != null){downfile.delete();Toast.makeText(getApplicationContext(), downfile+"已删除!", Toast.LENGTH_LONG).show();}elseToast.makeText(getApplicationContext(), "没有该文件", Toast.LENGTH_LONG).show();break;case R.id.onlinePlay:new Thread(new Runnable(){@Overridepublic void run(){//把http://abv.cn/music/光辉岁月.mp3传入并 播放音乐musicPlayer.play(pathtext);}}).start();break;case R.id.stop://暂停musicPlayer.pause();break;default:break;}}}private void downLoad(String pathtext, File savefile){/*** 开启线程进行下载*/task = new DownloadTask(pathtext, savefile);new Thread(task).start();}private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg){// TODO Auto-generated method stubswitch(msg.what){case SHOW_PROGRESSBAR:/*** 使用progressBar显示下载进度*/int progressValue = msg.getData().getInt("percent");progressBar.setProgress(progressValue);resultText.setText(progressValue+"%");if(progressBar.getProgress() == progressBar.getMax()){Toast.makeText(getApplicationContext(), "下載完成", Toast.LENGTH_LONG).show();}break;}super.handleMessage(msg);}};private final class DownloadTask implements Runnable{private String path = null;private File file = null;public DownloadTask(String pathtext, File savFile){this.path = pathtext;this.file = savFile;}/*** 通过接口监听下载进度*/DownloadLinstener downloadLinstener = new DownloadLinstener(){@Overridepublic void onDownloadSize(int precent){Message msg = new Message();msg.what = SHOW_PROGRESSBAR;msg.getData().putInt("percent", precent);handler.sendMessage(msg);}};@Overridepublic void run(){/*** 开始下载*/downloader.downFile(downloadLinstener, path, file);}}class SeekBarChangeEvent implements OnSeekBarChangeListener{int progress;@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser){/*** SeekBar的进度变化监听 把百分进度转变为总文件中的大小* progress为百分比* this.progress为实际播放文件当前位置的大小*/this.progress = progress* musicPlayer.mediaPlayer.getDuration()/seekBar.getMax();}@Overridepublic void onStartTrackingTouch(SeekBar seekBar){/*** 开始拖动监听*/}@Overridepublic void onStopTrackingTouch(SeekBar seekBar){/*** 停止拖动监听 * seekTo()的参数是相对与影片时间的数字,而不是与seekBar.getMax()相对的数字*/musicPlayer.mediaPlayer.seekTo(progress);}}@Overrideprotected void onDestroy(){// TODO Auto-generated method stubsuper.onDestroy();musicPlayer.stop();}
接口
package com.Javen;public interface DownloadLinstener
{public void onDownloadSize(int precent);
}
下载类:
package com.Javen;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;public class Downloader
{private HttpResponse httpResponse = null;private HttpEntity httpEntity = null;private InputStream inputStream =null;private OutputStream outputStream = null;private long downLenth = 0;//原始文件的总大小private long fileSize = 0;private static final String TAG = "Downloader";public void downFile(DownloadLinstener linstener, String path, File file){// TODO Auto-generated method stub//获取一个Get对象HttpGet httpGet = new HttpGet(path);//获取一个客户端HttpClient httpClient = new DefaultHttpClient();//向服务端发送请求try{httpResponse = httpClient.execute(httpGet);httpEntity = httpResponse.getEntity();//获取输入流inputStream = httpEntity.getContent();fileSize = httpEntity.getContentLength();
// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));//创建一个可随机读取位置的fileRandomAccessFile randfile = new RandomAccessFile(file, "rwd");byte[] buffer = new byte[1024];int offset = 0;while((offset = inputStream.read(buffer, 0, 1024)) != -1){randfile.write(buffer, 0, offset);downLenth += offset;float num = (float)downLenth/(float)fileSize;int percent = (int)(num * 100);linstener.onDownloadSize(percent);}randfile.close();inputStream.close();downLenth = 0;} catch (ClientProtocolException e){// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}public long getFileSize(){return fileSize;}public void setFileSize(int size){fileSize = size;}
}
1、首先写下一个接口
package com.Javen;public interface DownloadLinstener
{public void onDownloadSize(int precent);
}
2、其次在Activity中写下便于其他类调用的接口,以及回调后改做的动作
/*** 通过接口监听下载进度*/DownloadLinstener downloadLinstener = new DownloadLinstener(){@Overridepublic void onDownloadSize(int precent){Message msg = new Message();msg.what = SHOW_PROGRESSBAR;msg.getData().putInt("percent", precent);handler.sendMessage(msg);}};
3、在下载类中进行回调
while((offset = inputStream.read(buffer, 0, 1024)) != -1){randfile.write(buffer, 0, offset);downLenth += offset;float num = (float)downLenth/(float)fileSize;int percent = (int)(num * 100);linstener.onDownloadSize(percent);}
当A类需要执行的动作是需要等待B类的操作以及数据是就可以使用回调函数,在A类定义回调函数,然后在B类中进行回调!
Android回调函数理解相关推荐
- nodejs回调函数理解
回调实例 问题:想要得到一秒后 计算出的结果 //错误写法function add(x,y) {console.log(1);setTimeout(function () {console.log(2 ...
- android 回调函数二:应用实例
前言:如果对android回调的概念不明白的请看:android 回调函数一:基本概念 1.定义接口 package com.app.util;public interface ZYJCallBack ...
- android 回调函数一:基本概念
1.概念 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数. 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C ...
- Java回调函数理解和应用
#Java回调函数理解和应用 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的. 在未理解之前,我也是一脸懵逼,等我理 ...
- Android回调函数机制那点事
引言 在Android的学习过程中经常会听到或者见到"回调"这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是 ...
- android回调函数
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46837287 在我们进行android开发 ...
- android final函数,Android 回调函数 解析问题
大家先看看我的代码,Okhttp访问接口返回json 然后 解析回调的例子 public static void get(String url, final CallBack callback) { ...
- 关于Android回调的理解
现在学习Android的过程中,一个一直没有理解好的点就是回调了,虽然实际上一直都在使用,比如最常见的就是一个Button,设置点击事件,即setOnClickListener,这就是一个接口,然后必 ...
- Android和Java中的回调函数
在 Android 的学习过程中遇到了回调函数,经过一段时间的理解,将自己的收获整理如下,希望对迫切希望了解这方面知识的同学有所启发. 回调函数的理解如下: 在A类中定义了一个方法,这个方法中用到了一 ...
最新文章
- 我在神策做研发 | 码农变身“建筑师”:安逸中离走,责任中成长
- Nginx+Lua(OpenResty) HelloWorld
- 下周见!Redmi K50标准版配置细节曝光:骁龙870+67W快充
- activemq和kafka的区别
- 总结vue几种页面刷新方法
- leetcode python3 简单题125. Valid Palindrome
- 9-8 更新 - 2017 Citrix partner webinar PPT及在线观看地址
- python读音-原来Python应该这么念,怪不得总被嘲笑~
- 中缀表达式转前缀表达式
- 七个国外免费杀毒软件
- 使用计算机粘贴板的步骤,电脑中快速打开剪贴板查看器的方法
- 数据过多 如何实现页面滚动
- 升级版微生物16s测序报告|解读
- ExtremeNet:Bottom-up Object Detection by Grouping Extreme and Center Points
- Homekit智能家居DIY一智能插座
- 《惢客创业日记》2019.11.28(周四)近者悦,远者来
- 1分钟学会便捷绘制跨职能流程图
- 打开window桌面文件夹路径的方法
- c++成员函数指针的本质
- pip异常No module named ‘pip‘处理方法