我正在编写一个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类等到另一个类完成其任务?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)