简而言之我的问题:我如何检测给定用户类/对象是否存在(并且在正确的位置)java注释.
详细的"问题"
可以说我有两个java类:
public class Line {
private List<Cell> cells;
public Line(Object... annotatedObjects) {
// check if annotations @Line and @Cell are present in annotatedObjects.
}
// getter/setter for cells.
}
public class Cell {
// some members
// some methods
}
Run Code Online (Sandbox Code Playgroud)
Line对象包含Cells.
我还有两个注释,如:
public @interface Line {
// some stuff here
}
public @interface Cell {
// some stuff here
}
Run Code Online (Sandbox Code Playgroud)
我还有一堆用户类(本例中有两个用户类),它们包含我指定的@Line和@Cell注释,如:
@Line(name="pqr", schema="three")
public class AUserClass {
@Cell
private String aString;
}
@Line(name="xyz", schema="four")
public class AnotherUserClass { …
Run Code Online (Sandbox Code Playgroud) 刚开始使用GreenRobot的EventBus.
只有一件事让我苦苦挣扎:你如何在不同的线程之间进行通信,以便onEventXY()方法实际上也在订阅的线程中执行.
似乎当您发布事件时,订阅者onEvent方法是从与发布事件的线程相同的线程调用的.那不是我想要的.
我希望能够使用EventBus进行线程间通信,使得实际接收的事件对象由接收事件对象的线程中的onEvent方法处理.
那可能吗?
例:
MainThread在EventBus上发布一个事件,backGroundThread1在其onEventXY()方法中接收它并在其自己的线程中执行代码(设置一些变量),backGroundThread2在其onEventXY方法中接收它并在其自己的线程中执行代码(设置一些变量).
如果这还不可能(我),我注定要使用线程队列,比如BlockingQueue,这很难实现.
有任何想法吗?
根据标准的Android文档,启动服务(启动服务)的首选方法是使用如下的显式意图:
// Using explicit intent:
Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
// or:
Intent serviceIntent = new Intent(this, MyService.class);
startService(serviceIntent);
Run Code Online (Sandbox Code Playgroud)
您还可以使用带有清单中指定的操作字符串的隐式intent来启动/停止服务,如下所示:
// Using implicit intent:
static final String serviceAction = "com.example.my.app.services.MYSERVICE";
Intent serviceIntent = new Intent(serviceAction);
startService(serviceIntent);
// AndroidManifest.xml:
<service android:name="com.example.my.app.services.MyService"
android:exported="false" android:process=":services" >
<intent-filter>
<!-- Start/Stop service -->
<action android:name="com.example.my.app.services.MYSERVICE" />
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
当服务仅在本地使用时(不允许第三方应用程序启动或绑定它),文档说明您不应在清单服务标记中包含intent-filter,并且应将导出的标记设置为false.
注意:活动和服务在不同的进程(:application和:services进程)中运行.活动和服务之间的通信是通过实现AIDL接口完成的(这样做是因为只有AIDL远程接口允许我在需要同时处理IPC的服务中进行多线程,不仅在活动之间,而且主要在以下运行的服务之间进行:服务流程).
我的问题是:
问题1:当我在我的应用程序中使用的活动和服务在两个不同的进程中运行时,我是否需要使用隐式意图而不是显式意图来启动和停止服务?
Q2:当:应用程序进程消失(销毁,不再在内存中)并且:服务进程在后台运行时,如何再次从新的:应用程序进程连接到已运行的:services进程?不知何故,我需要再次获得对:services进程的引用,以便我可以在该进程中停止正在运行的服务.使用AIDL afaik无法做到这一点.
问题是Android可以并且将在资源不足时轻松破坏:应用程序进程,只要:services进程继续运行,我就可以了.(是的,我知道通过将服务设置为前台服务等来影响流程,我也可以阅读手册;)但这不是我的问题).
当活动和服务处于分离的进程中并使用AIDL时,我无法找到与我的问题相关的任何信息或答案,并且当:应用程序进程需要在Android被杀死之后再次"找到":服务进程时用户再次进入应用程序(之后他/她离开应用程序).
欢迎任何专家级的建议.
如果您有与服务通信的活动,或与服务通信的其他服务,哪种"通信协议"更快将其消息传递给绑定方?
传输到服务/从服务传输的消息都是字符串或可分配对象.
如果您想将批量数据发送到其他服务或活动,我很难确定哪种方法更快.我找不到有关Messenger发送的Intents或Messages的处理速度的详细信息.
谁有这方面的体验?
问题:
与在Android中使用Messenger到Messenger通信相比,使用Handler到Handler通信是"更好"(=更快,更少开销)吗?
情况:
Android应用程序,有一堆活动和一个服务运行(启动服务).在服务中,一些线程在服务的主线程旁边运行.应用程序启动,第一个活动启动服务,服务启动,第一个活动转发到第二个活动,第二个活动绑定到服务,...
处理程序处理程序:
...服务分发对服务处理程序的引用,第二个活动定义自己的处理程序,第二个活动现在可以使用服务处理程序直接与服务通信.要让服务处理程序知道它必须回复活动处理程序,Message对象中的msg.obj字段可用于设置"reply-to"处理程序(=活动中的处理程序).现在,在活动和服务之间成功建立双向通信.
Messenger至Messenger:
...服务分发对服务信使的引用,第二个活动定义自己的信使,第二个活动现在可以使用服务信使间接地与服务通信,服务信使将消息(消息对象)转换为Parcelable对象,然后重新转换Parcelable对象返回到一个新的(但相等的)Message对象,该对象被移交给服务的处理程序.要让服务信使知道它必须回复活动信使,可以使用活动中的信使设置msg.replyTo字段.双向通信成功设置.
问题":
当我只需要在我的应用程序中进行直接通信时,为什么我需要Messenger到Messenger设置?一个进程中的所有线程都可以通过使用其处理程序轻松进行通信(假设这些线程都已正确设置了自己的处理程序).我不希望信使首先展平两个处理程序之间共享的Message对象,除了"盲目地遵循Android服务教程"之外,这只是增加了开销而没有任何目的.
可能的方法:
启动服务,绑定一次,让服务分发一个本地绑定对象,在onServiceConnected()的ServiceConnection实现中设置活动中的服务处理程序,让活动将它存储在全局内存空间的某个地方,切换到第三,第四,第五个活动,你永远不必再在所有其他活动中绑定,因为所有活动都知道自己的处理程序(在每个活动中单独设置),并且可以从全局内存空间获取服务处理程序.如果服务需要响应第四个活动的处理程序,则第四个活动只是将自己的处理程序(fourthHanlder)添加到msg.obj字段,并且服务知道必须在何处发送回复消息.而已.
除此之外:活动在ui-thread/main-thread上运行,服务也在ui-thread/main-thread上运行,所以实际上它们是同一个线程的一部分,只有不同的处理程序.或者这是我的错误思考?
这意味着整个Messenger的东西只是同一进程中线程之间本地(内部)通信的额外开销!这是不需要的,除非Android系统在内部判断出信使是否在同一过程中相互通信并绕过消息的扁平化并跳过转换为Parcelable对象,以便信使实际上直接在处理程序之间进行排序(没有用户/程序员实际上已经意识到这一点.至少我不知道这个,如果这是我现在正在思考的那样真实的话).
我看到通过使用以下方法,只有三种方法可以在活动和服务之间创建异步通信:
我相信处理程序是线程之间进行通信的最快方式,后续是信使,最后是意图.这是真的???
请分享您对此事的见解和经验,即使我看到的不正确:)谢谢.
multithreading android handler android-intent android-service
在Java中是否可以创建一个静态工厂方法/类,它使用接口作为参数化类型并返回给定接口的实现类?
虽然我对泛型的了解有限,但这就是我想要做的:
// define a base interface:
public interface Tool {
// nothing here, just the interface.
}
// define a parser tool:
public interface Parser extends Tool {
public ParseObject parse(InputStream is);
}
// define a converter tool:
public interface Converter extends Tool {
public ConvertObject convert(InputStream is, OutputStream os);
}
// define a factory class
public class ToolFactory {
public static <? extends Tool> getInstance(<? extends Tool> tool) {
// what I want this method to return is: …
Run Code Online (Sandbox Code Playgroud) android ×4
java ×3
annotations ×1
constructor ×1
explicit ×1
factory ×1
generics ×1
handler ×1
implicit ×1
intentfilter ×1
messenger ×1
parcelable ×1
queue ×1
reflection ×1
runtime ×1