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回调函数理解相关推荐

  1. nodejs回调函数理解

    回调实例 问题:想要得到一秒后 计算出的结果 //错误写法function add(x,y) {console.log(1);setTimeout(function () {console.log(2 ...

  2. android 回调函数二:应用实例

    前言:如果对android回调的概念不明白的请看:android 回调函数一:基本概念 1.定义接口 package com.app.util;public interface ZYJCallBack ...

  3. android 回调函数一:基本概念

    1.概念 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数. 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C ...

  4. Java回调函数理解和应用

    #Java回调函数理解和应用 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的. 在未理解之前,我也是一脸懵逼,等我理 ...

  5. Android回调函数机制那点事

    引言 在Android的学习过程中经常会听到或者见到"回调"这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是 ...

  6. android回调函数

    版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46837287 在我们进行android开发 ...

  7. android final函数,Android 回调函数 解析问题

    大家先看看我的代码,Okhttp访问接口返回json 然后 解析回调的例子 public static void get(String url, final CallBack callback) { ...

  8. 关于Android回调的理解

    现在学习Android的过程中,一个一直没有理解好的点就是回调了,虽然实际上一直都在使用,比如最常见的就是一个Button,设置点击事件,即setOnClickListener,这就是一个接口,然后必 ...

  9. Android和Java中的回调函数

    在 Android 的学习过程中遇到了回调函数,经过一段时间的理解,将自己的收获整理如下,希望对迫切希望了解这方面知识的同学有所启发. 回调函数的理解如下: 在A类中定义了一个方法,这个方法中用到了一 ...

最新文章

  1. 我在神策做研发 | 码农变身“建筑师”:安逸中离走,责任中成长
  2. Nginx+Lua(OpenResty) HelloWorld
  3. 下周见!Redmi K50标准版配置细节曝光:骁龙870+67W快充
  4. activemq和kafka的区别
  5. 总结vue几种页面刷新方法
  6. leetcode python3 简单题125. Valid Palindrome
  7. 9-8 更新 - 2017 Citrix partner webinar PPT及在线观看地址
  8. python读音-原来Python应该这么念,怪不得总被嘲笑~
  9. 中缀表达式转前缀表达式
  10. 七个国外免费杀毒软件
  11. 使用计算机粘贴板的步骤,电脑中快速打开剪贴板查看器的方法
  12. 数据过多 如何实现页面滚动
  13. 升级版微生物16s测序报告|解读
  14. ExtremeNet:Bottom-up Object Detection by Grouping Extreme and Center Points
  15. Homekit智能家居DIY一智能插座
  16. 《惢客创业日记》2019.11.28(周四)近者悦,远者来
  17. 1分钟学会便捷绘制跨职能流程图
  18. 打开window桌面文件夹路径的方法
  19. c++成员函数指针的本质
  20. pip异常No module named ‘pip‘处理方法

热门文章

  1. Courage 勇气
  2. C语言链栈(基本压栈,弹栈,取栈顶元素)
  3. grep命令常用用法示例
  4. php 自定义字符串转义,PHP 字符串转义函数(addslashes,stripslashes)功能实例
  5. 神武服务器维护时间表,《神武4》:4月10日更新维护完整内容盘点
  6. 惠新宸:PHP在百度的应用现状及展望
  7. 【Vue学习总结】21.Vue-UI框架之Mint UI的使用
  8. mysql主从复制 主键 id_MySQL主从复制详解
  9. QT翻译(中英文切换
  10. 【转】二战,真实版越狱王!冯.维拉