java-如何让一个Android类等到另一个类完成其任务?

java-如何让一个Android类等到另一个类完成其任务?,第1张

概述我正在编写一个Android消息传递应用程序,并且一个类正在调用另一个类,并且我希望调用类在继续之前等待被调用者类完成.呼叫者类别(MessageManagement)程式码片段如下:privatestaticMessengermyMessenger;try{Messagemsg=Message.obtain();msg.arg1=constructedM

我正在编写一个Android消息传递应用程序,并且一个类正在调用另一个类,并且我希望调用类在继续之前等待被调用者类完成.

呼叫者类别(MessageManagement)程式码片段如下:

private static Messenger myMessenger;try {  Message msg = Message.obtain();  msg.arg1 = constructedMessage.length();  msg.arg2 = -1;  msg.obj = constructedMessage;  Log.d(TAG, "Calling myMessenger.send()");  myMessenger.send(msg);  Log.d(TAG, "Sent");} catch (Exception e) {  e.printstacktrace();}// Wait here until myMessenger completes its taskdoOtherStuff();

现在,doOtherStuff()在myMessenger启动之前开始并完成.我需要myMessenger在doOtherStuff()开始之前完成.

我已经读过关于wait()和notify()的信息,但是我不确定如何在这里实现它,或者它是否是正确的选择.

有关程序流程的一些背景.它基本上是我继承的消息应用程序,因此我不确定它的框架.从我可以看出的代码流跟踪:

>接收到SMS消息时,SMS接收器broadcastReceiver(SmsReceiver)对其进行处理,获取发送者地址和消息正文,然后调用SMS处理程序服务(HandleSmsService),然后使用以下代码在可运行的调用调用者类:

HandleSmsService

public class HandleSmsService extends Service {  private String message;  private MessageManagement messageManager;  private Handler timeoutHandler = new Handler();  @OverrIDe  public voID onStart(Intent intent, intent startID) {    message = intent.getExtras().getString("message");    messageManager = new MessageManagement(this);    timeoutHandler.postDelayed(runnable, 10);  }  private Runnable runnable = new Runnable() {    @OverrIDe    public voID run() {      try {        messageManager.handleMessage(message);        stopSelf();      } catch (Exception e) {        e.printstacktrace();      }    }  };

MessageManagement是我的调用方类,而MessageManagement.handleMessage()是前面介绍的最多的代码段.

当MessageManagement.handleMessage()调用myMessenger.send(msg)时,显然会在被调用者类中调用另一个Handler.此处理程序代码如下:

private Handler smsHandler = new Handler() {  @OverrIDe  public voID handleMessage(Message msg) {    // do some stuff  }};

解决方法:

我假设发布的代码正在MainThread上运行,而您使用处理程序的原因是,在接收到该消息时,另一个线程执行了异步 *** 作.
在这种情况下,您不能在线程上使用wait,因为它将锁定UI并可能导致应用程序不响应错误.

在不更改太多代码的情况下,一种方法是在构造消息中嵌套一个侦听器,例如

public class DoStuffRequest {    private OnFinishListener mOnFinishListener;    private boolean isCanceled;    private String mMessage;    public interface OnFinishListener {        public voID onFinish();    }    public DoStuffRequest(String message) {        mMessage = message;    }            public OnFinishListener getonFinishListener() {        return mOnFinishListener;    }    public voID setonFinishListener(OnFinishListener onFinishListener) {        mOnFinishListener = onFinishListener;    }    public voID cancel() {        isCanceled = true;    }    public voID notifyFinish() {        if (!isCanceled && mOnFinishListener != null) {            mOnFinishListener.onFinish();        }    }    public String getMessage() {        return mMessage;    }}

然后沿着这条线使用一些来使球滚动:

private static Messenger myMessenger;private DoStuffRequest mRequest;...private voID send(String message) {    mRequest = new DoStuffRequest(message);        mRequest.setonFinishListener(new ConstructedMessage.OnFinishListener() {        @OverrIDe        public voID onFinish() {            doOtherStuff();        }    });    try {        Message msg = Message.obtain();        msg.arg1 = constructedMessage.length();        msg.arg2 = -1;        msg.obj = constructedMessage;        Log.d(TAG, "Calling myMessenger.send()");        myMessenger.send(msg);        Log.d(TAG, "Sent");    } catch (Exception e) {        e.printstacktrace();    }}private voID doThisIfYouWantToCancel() {    if (mRequest != null) {        mRequest.cancel();    }}

异步处理完成后,您的处理程序/服务代码现在可以调用ConstructedMessage.finish()了.取决于doOtherStuff()的功能(例如,在 *** 作UI时),您可能想在MainThread上执行此 *** 作(上面编写的代码不是线程安全的,并且我假设您正在MainThread上调用侦听器).
还要记住,如果您不想再收到通知(例如,您要离开活动/片段),请调用ConstructedMessage.cancel().

这只是一种方法,根据您的需要,其他一些方法可能是更好的选择.

总结

以上是内存溢出为你收集整理的java-如何让一个Android类等到另一个类完成其任务?全部内容,希望文章能够帮你解决java-如何让一个Android类等到另一个类完成其任务?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088578.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存