• android IntentService和ResultReceiver的异步处理


    IntentService和ResultReceiver的异步处理

    1.在下载手机上从网络下载东西的时候会用到AsyncTask来方便处理,这里可以在用IntentService和ResultReceiver

    对一些基本概念做一些了解:

    IntentService

    IntentService是Service类的子类,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService,IntentService通过worker thread处理每个Intent对象,执行完所有的工作之后自动停止Service。

    说明:worker thread处理所有通过传递过来的请求,创建一个worker queue,一次只传递一个intent到onHandleIntent中,从而不必担心多线程带来的问题。处理完毕之后自动调用stopSelf()方 法;默认实现了Onbind()方法,返回值为null;

    它是Service、HandlerThread和Handler的强强联合。具有任务队列,顺序处理,

    当处理完全部任务后

    模式实现了StartCommand()方法,这个方法会放到worker queue中,然后在onHandleIntent()中执行0

    使用IntentService需要两个步骤:

    1、写构造函数

    2、复写onHandleIntent()方法

    好处:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求

    ResultReceiver

    Generic interface for receiving a callback result from someone. Use this by creating a subclass and implement onReceiveResult(int, android.os.Bundle), which you can then pass to others and send through IPC, and receive results they supply with send(int, android.os.Bundle).

    这是API上给的解释,说白了就是处理传过来的信息。和BroadCastReceiver一样的。

    2.下面给一个例子:

    1).调用startService。
    2).service中开始操作处理,并且通过消息告诉activity处理已经开始。
    3).activity处理消息并且显示进度条(进度条就不显示了,就打印出一段话即可)
    4).service完成处理并且返回给activity需要的数据。
    5).activity处理数据。
    6).service通过消息告诉activity处理完成,并且kill掉自己。
    7).activity取得消息并且结束掉进度条。

    代码如下:

    QueryService:

     1 public class QueryService extends IntentService {
     2 
     3     public QueryService() {
     4         super("service");
     5     }
     6 
     7     public final String action = "query";
     8     /**
     9      * 进行一些网络操作,如下载文件等
    10      */
    11     @Override
    12     protected void onHandleIntent(Intent intent) {
    13         System.out.println("进了service");
    14         final ResultReceiver receiver = intent.getParcelableExtra("receiver");
    15         String command = intent.getStringExtra("command");
    16         Bundle bundle = new Bundle();
    17         bundle.putString("data", "查询到的数据 ");
    18         if (command.equals("query")) {
    19             receiver.send(1, bundle);
    20             try {
    21                 // do something with data
    22                 receiver.send(2, new Bundle());
    23 
    24             } catch (Exception e) {
    25                 e.printStackTrace();
    26                 receiver.send(3, new Bundle());
    27 
    28             }
    29 
    30         }
    31         this.stopSelf();
    32     }
    33 }

    MainActivity:

     1 public class MainActivity extends Activity {
     2 
     3     @Override
     4     protected void onCreate(Bundle savedInstanceState) {
     5         super.onCreate(savedInstanceState);
     6         setContentView(R.layout.activity_main);
     7         findViewById(R.id.button).setOnClickListener(new OnClickListener() {
     8 
     9             @Override
    10             public void onClick(View v) {
    11                 Intent intent = new Intent(MainActivity.this,
    12                         QueryService.class);
    13                 intent.putExtra("command", "query");
    14                 intent.putExtra("receiver", new MyResultReceiver(new Handler()));
    15                 MainActivity.this.startService(intent);
    16             }
    17         });
    18     }
    19 
    20     // 对主界面进行一些修改
    21     private class MyResultReceiver extends ResultReceiver {
    22         private final int QUERY = 1, DELETE = 2, ERROR = 3;
    23 
    24         public MyResultReceiver(Handler handler) {
    25             super(handler);
    26         }
    27 
    28         @Override
    29         protected void onReceiveResult(int resultCode, Bundle resultData) {
    30             super.onReceiveResult(resultCode, resultData);
    31 
    32             switch (resultCode) {
    33             case QUERY:
    34                 System.out.println("query+query+query+query+query"
    35                         + resultData.getString("data"));
    36                 break;
    37             case DELETE:
    38 
    39                 System.out.println("delete+delete+delete+delete+delete+delete");
    40                 break;
    41             case ERROR:
    42                 System.out.println("error+error+error+error+error+error+");
    43                 break;
    44 
    45             }
    46 
    47         }
    48     }
    49 
    50 }

    运行后的效果是:

    从而可以知道顺序是:点击button -->> 启动QueryService  -->>根据传来的command执行相应功能-->> 执行完成以后发送广播给MainActivity告诉它执行后的结果-->>更新界面或则数据展示

    代码下载:代码

  • 相关阅读:
    Red Hat Enterprise Linux 7.2下使用RPM包安装SQL Server vNext
    VS2015解决方案资源管理器空白,不显示内容
    ArcEngine调用FeatureToLine工具传参问题
    ArcEngine调用GP里的Merge工具传参问题
    ArcGIS GP服务的发布及调用
    利用 Chrome 原生工具进行网页长截图
    关于ueditor与arcgis js api同用会报错的问题
    关于ueditor使用说明
    bootstraptable为行中的按钮添加事件
    关于html与body的高度问题
  • 原文地址:https://www.cnblogs.com/liangstudyhome/p/4137999.html
Copyright © 2020-2023  润新知