异步任务与回调

首先将异步任务及回调包装在一个controller类中

package com.example.zzz;
import android.content.Context;
import android.os.AsyncTask;
public class BaseController {
 private Context ctx;
 private BaseControllerCallBack callback;
 /**
  * 构造函数
  * @param ctx
  * @param BaseControllerCallBack callback
  */
 public BaseController(Context ctx, BaseControllerCallBack callback){
  this.ctx=ctx;
  this.callback=callback;
 }
 public void prepareTask(String param1,String param2,String param3){
  new PrepareTask(param1,param2).execute(param3);
 }
 
 public void doTask(String param1,String param2,String param3){
  new DoTask(param1,param2).execute(param3);
 }
 
 
 public class PrepareTask extends AsyncTask<String, Void, String>{
  private String param1;
  private String param2;
  private String param3;
  
  public PrepareTask(String param1,String param2){
   this.param1=param1;
   this.param2=param2;
  }
  @Override
  protected String doInBackground(String... params) {
   param3=params[0];
   return test(param1,param2,param3);
  }
  @Override
  protected void onPostExecute(String result) {
   if(callback!=null){
    callback.onPreparedDone(result);
   }
  }
  
 }
 public class DoTask extends AsyncTask<String, Void, String>{
  private String param1;
  private String param2;
  private String param3;
  
  public DoTask(String param1,String param2){
   this.param1=param1;
   this.param2=param2;
  }
  @Override
  protected String doInBackground(String... params) {
   param3=params[0];
   return test(param1,param2,param3);
  }
  @Override
  protected void onPostExecute(String result) {
   if(callback!=null){
    callback.onDoTaskDone(result);
   }
  }
  
 }
 
 
 //===============回调接口================//
 public interface BaseControllerCallBack{
  /**
   * action1
   * @param result
   */
  public void onPreparedDone(String result);
  /**
   * action2
   * @param result
   */
  public void onDoTaskDone(String result);
 }
 
 private String test(String param1,String param2,String param3){
  return "hello";
 }
 
}

在主程序中调用时

private void init() {

     controller=new BaseController(getApplicationContext(), callback);

     controller.prepareTask("11", "22", "33");

 }

    private BaseControllerCallBack callback=new BaseControllerCallBack() {

  

  @Override

  public void onPreparedDone(String result) {

   controller.doTask("11", "22", "33");

  }

  

  @Override

  public void onDoTaskDone(String result) {

   //dosomething

  }

  

 };
时间: 2024-08-16 17:20:14

异步任务与回调的相关文章

浅谈委托,事件,异步调用,回调等概率

直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某一类方法的总定义.    事件           事件是某个类用于传递消息的方式.事件之余委托,犹如属性之余变量即是委托的封装.     好了,明确了概念,接下来说示例.    示例         有3个对象  鼠标,button,winform .鼠标点击button对象,触发button的c

JavaScript异步编程__“回调地狱”的一些解决方案

异步编程在JavaScript中非常重要.过多的异步编程也带了回调嵌套的问题,本文会提供一些解决"回调地狱"的方法. setTimeout(function () { console.log('延时触发'); }, 2000); fs.readFile('./sample.txt', 'utf-8', function (err, res) { console.log(res); }); 上面就是典型的回调函数,不论是在浏览器中,还是在node中,JavaScript本身是单线程,因此

并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制

1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 1 """先进先出 队列""" 2 import queue 3 q=queue.Queue(3) #先进先出->队列 4 5 q.put('first') 6 q.put(2) 7 # q.put('third') 8 # q.put(4) 9 q.put(4,block=False) #q.put_no

异步调用与回调机制,协程

1.异步调用与回调机制 上一篇我们已经了解到了两组比较容易混淆的概念问题,1.同步与异步调用 2.阻塞与非阻塞状态.在说到异步调用的时候,说到提交任务后,就直接执行下一行代码,而不去拿结果,这样明显存在缺陷,结果是肯定要拿的,这辈子都肯定是要拿到这个结果的,没有这个结果后面的活又不会干,没办法,只能去拿结果的,那么问题是异步调用提交任务后,如何实现既要拿到结果又不需要原地等的理想状态呢?专门为异步调用配备了一个方法--回调机制 先来想想我们之前是怎么拿到一个函数的结果,就传给另外一个函数取执行,

5.1.23 异步调用与回调机制

提交任务的两种方式#1.同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行 #2.异步调用:提交完任务后,不地等待任务执行完毕 同步调用: from concurrent.futures import ThreadPoolExecutor import random import time def la(name): print(name,'正在拉....') res = random.randint(0, 10) time.sleep(res) r

js的for循环中出现异步函数,回调引用的循环值始终是最后的值

一.问题 今天工作中解决bug发现是由“for循环的异步函数,回调引用的循环值始终是最后的值”的现象导致的,如: for (var i = 0; i < files.length; i++) { var itemFile = files[i]; fs.stat("./uploads/" + itemFile, function (err, stats) { if (stats.isDirectory()) { console.log(itemFile+i); } else { c

Mina、Netty、Twisted一起学(九):异步IO和回调函数

用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,比如Ajax.jQuery的动画等. $.get(url, function() { doSomething1(); // (3) }); // (1) doSomething2(); // (2) 上面的代码是jQuery的Ajax,因为Ajax是异步的,所以在请求URL的过程中并不会堵塞程序,也就是程序运行到(1)并不用等待Ajax请求的结果,就继续往下运行(2).而$.get的

异步编程C#回调方法

1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库.异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行. 2.同步与异步的区别 同步(Synchronous):在执行某个操作时,应用程序必须等待该操作执行完成后才能继续执行. 异步(Asynchronous):在执行某个操作时,应用程序可在异步操作执行时继续执行.实质:异步操作,启动了新的线程,主线程与方法线程并行执行. 3.异

.NET异步编程之回调

C#中异步和多线程的区别是什么呢?异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为异步和多线程是等同的概念.但是,异步和多线程还是有一些区别的.而这些区别造成了使用异步和多线程的时机的区别. 异步操作的本质 所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础. 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘.光驱的技术规格中都有明确DMA的模式指标,其实网卡.声卡.显卡也是有DMA功能的.DMA