我最近问了一个非常相似的问题,但不确定如何用它来表达.收到一些反馈并研究了一些潜在的解决方案后,我现在再次询问我认为对该问题的更好解释.
我的Android应用程序使用我的库(parentLib),这个库是从另一个库(childLib)引用方法构建的.因此,App本身使用parentLib(.jar库),而parentLib又使用childLib(另一个.jar库).
这里的问题是,当应用程序尝试使用涉及嵌套库(childLib)的任何内容时,它会收到NoClassDefFoundError,这会导致应用程序崩溃.我认为这个问题是由于App无法解析嵌套依赖项.
我不能真正使用Android库项目,因为我需要源代码尽可能混淆和难以理解.我也尝试使用Android Studio创建这些库,但遗憾的是没有更好的结果.
我的选择(我认为)是:
结合图书馆
我可以将childLib和parentLib组合成一个.jar库,将它们分成不同的包.但这很难,因为实际上我的应用程序有大约6个嵌套库.
坚持客户使用多个库
而不是向客户说,"这里有一个简单的库(parentLib)供您使用",我可以改为说,"这里有7个不同的库供您导入(parentLib,childLib等),否则什么都不会起作用".不完全专业!
其他选择
我欢迎任何人有任何其他建议!
提前致谢.
我目前正在尝试使用 WebSockets,以减少/消除在潜在的低带宽环境中对持续 AJAX 请求的需求。所有设备都兼容 WebSocket,所以没有问题,我试图将其保留为原生 PHP WebSocket,没有 Node.js 或其他框架/库(到目前为止一直很好)。
我想做的是决定如何通知连接的客户端有关另一个客户端对数据库的更新。所讨论的用例是一个人按下其设备上的按钮,然后设备会提醒该人员的经理按下该按钮。所以我有两个选择如下:
1. 循环数据库查询 (PHP)
我的第一个想法是向 WebSocket 服务器插入一个查询,该查询实际上是在说“警报字段是否已更改?如果是,请通知经理”。虽然这是最直接、最明智的方法(我能想到的),但设计一个旨在减少服务器压力的 PHP 脚本似乎很浪费,该脚本现在每秒运行一个查询,但是,至少这可以确保当检测到数据库更新时,将发送更新。
2. 客户端发送通知
我的另一个想法是,当客户端更新数据库时,他们实际上可以自己发送 WebSocket 通知。这样做的优点是减少任何密集和循环查询,但也意味着每次我想要更改任何数据时都需要发送 WebSocket 消息,例如:
$.post("AttemptDatabaseUpdate.php", {Data}).function(Result) // Don't worry about the semantics of this, it's not actual code
{
if(Result == "Successful")
{
SendWebSocketNotification(OtherData);
}
}
Run Code Online (Sandbox Code Playgroud)
也许这是最好的选择,因为它是最有效的,但我担心更新数据库和发送 WebSocket 通知之间的连接可能会断开,这可能需要在 PHP 文件中进行回退检查,与第一个解决方案中的非常相似,尽管间隔较长(例如每 30 秒)。
3.MySQL触发器?
这纯粹是一个猜测,但也许另一种选择是创建一个 MySQL 触发器,它可以以某种方式直接通知 server.php 文件?我不知道这是如何工作的,并且会冒险猜测这可能最终会产生与解决方案 #1 相同或相似的查询要求,但这只是一个......
预先感谢您的帮助 :)
编辑:解决方案可能性 4
事实上,另一个想法刚刚出现在我的脑海中,用于更新数据库的 PHP 文件实际上可以内置一个 WebSocket 消息。这样当PHP文件更新数据库时,通过PHP通知WebSocket服务器,这可能吗?
我正在尝试使用 DocumentFile(由于存储访问框架)在创建文件之前检查文件是否存在。但是DocumentFile().fromTreeUri()删除了可能的 Uri 的不存在部分,这会导致DocumentFile().exists()始终返回 true,无论它是否存在。
我创建了一个简单的例子来证明我的观点。首先我们要求用户选择一个目录:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Ask the user for the source folder
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 100);
}
Run Code Online (Sandbox Code Playgroud)
在响应时,我们添加/fictionalFile到路径(从而使其成为一个不存在的文件),然后检查它是否存在:
public void onActivityResult(int requestCode, int resultCode, Intent resultData)
{
if (resultCode == RESULT_OK)
{
if(requestCode == 100)
{
Uri fictionalURI = Uri.parse(resultData.getData()+"/fictionalFile");
DocumentFile fictionalFile = DocumentFile.fromTreeUri(this, fictionalURI);
Log.i("STORAGE", "FICTIONAL URI: "+fictionalURI);
Log.i("STORAGE", "FICTIONAL DOCUMENTFILE URI: "+fictionalFile.getUri());
if(fictionalFile.exists())
{
Log.i("STORAGE", "Fictional file exists");
} …Run Code Online (Sandbox Code Playgroud) android ×2
java ×2
dependencies ×1
documentfile ×1
javascript ×1
mysql ×1
php ×1
phpwebsocket ×1
uri ×1
websocket ×1