解析和Android:对新手开发人员的建议

注解


在本文中,我想分享我对使用BaaS的总体印象-使用一个名为Parse的解决方案来开发Android应用程序的后端,并讨论在开发期间必须面对的所有“陷阱”。 当我还是大三的时候,这个平台第一次得到了我的工作同事的建议,而我身后只有一个商业项目。 撰写本文的动机是,我花了很多时间和精力去寻找兼容版本的库,并思考平台开发人员的奇怪决定,或者仅仅是因为我仍然没有找到有关此主题的文章 。 此外,我不会告诉任何有关什么是Parse以及如何连接和配置它的信息,但以防万一,我将把所有必要的链接都留给您阅读。

问题#1:结合使用Parse Server和PostgreSQl


使用此配置的原因是,服务器已部署在VDS托管上,并且无法使用远程MLab数据库,因为在开发时,Roskomnadzor试图在俄罗斯阻止Telegram,并且在没有VPN的情况下存在连接问题。 由于没有时间在控制台Linux上配置VPN,因此该项目已经启动,因此我决定在服务器上使用本地数据库。 我选择PostgreSQL是因为我有丰富的经验。

人生秘诀1:为了使数据库能够正常工作而没有数据类型错误,在安装postgres时,您需要安装postgis。 之后,您需要创建一个数据库,并在创建create之后立即连接所有postgis扩展。 您可以在此处阅读有关如何将postgis扩展连接到数据库的信息 。 连接所有扩展之后,您可以将数据库连接到服务器,打开仪表板,并看到表已正确创建。

Lifehack 2号:使用Parse server> = 2.7.2的版本。 当我从gita下载测试项目时,有一个服务器版本2.2.5,似乎一切正常,但后来出现一个错误:在保持地理位置坐标的同时,纬度和经度改变了位置。 有2种情况:如果坐标的绝对值小于90,则地图上的标记位于另一个位置,否则应用程序将崩溃,并且Lat的绝对值不应大于90的日志落入控制台。 然后我开始了为期2天的哑巴寻找解决方案。 我只是在各种论坛和github问题中找不到的东西:在Cloud函数中翻转坐标(不起作用!); 在PostgresStorageAdapter中翻转坐标(更改之后出现了很多错误,我不想钻研工作日的结尾,关闭计算机然后离开)。 第二天,我查看了发行版,发现在2.7.2版中,PostgresStorageAdapter中修复了一个错误。 快速修复package.json中的版本,瞧瞧,它可以正常工作。 此时,已经有3.x.x版本,我尝试使用它,但是开发人员进行了许多与云功能有关的更改,并且在启动时弹出了其他错误。 没有时间来修复工作代码,因此版本2.7.2适合我。 如果您只是开始项目,那么当然最好使用最新版本。

问题2:LiveQuery不会退订


我花了一天多的时间来解决这个问题。 她该死的很奇怪也很明显。

最初,架构是这样的:

public class Subclass extends ParseObject { // init columns, create getters & setters } public class QueryHelper { public static ParseQuery getQuery(Param... params) { ParseQuery query = ParseQuery.getQuery(Subclass.class); // init query by params return query; } } public class MainActivity extends Activity { public void onResume() { ParseLiveQueryClient.getClient().subscribe(QueryHelper.getQuery(), callback); } public void onPause() { ParseLiveQueryClient.getClient().unsubscribe(QueryHelper.getQuery(), callback); } } 

当您退出屏幕时,该方法被调用,但请求并未取消订阅。 如您所知,LiveQuery根据请求进行预订,并且可以在回调中跟踪与请求相对应的数据中的任何更改。 退订也应要求提供。 订阅者对象以订阅方法返回,但是此对象绝对没有用,因为它不包含“取消订阅”方法,并且LiveQueryClient本身不包含带有订阅者参数的“取消订阅”方法。 打开调试,我开始逐步进入“取消订阅”的相同方法。 客户端本身将私有存储订阅列表。 在该方法中,开发人员循环浏览此工作表,并将来自参数的请求与私有请求进行比较,该私有请求通过未定义的函数equals存储在预订对象中,该函数等于通常的==,并比较复杂对象的地址。 这就说明了一切,因为在我的项目中有一个带有函数的类,可以为我创建正确的查询。 并且由于总是重新创建请求对象,因此,请求的地址是不同的,等于不起作用,也没有发生退订的情况。 我按以下方式解决了这个问题:单例,并且有效。

它看起来像这样:

 public class Subclass extends ParseObject { // init columns, create getters & setters } public class QueryHelper { public static final ParseQuery query; public static ParseQuery getQuery(Param... params) { if (query == null) { query = ParseQuery.getQuery(Subclass.class); // init query by params } return query; } } public class MainActivity extends Activity { public void onResume() { ParseLiveQueryClient.getClient().subscribe(QueryHelper.getQuery(), callback); } public void onPause() { ParseLiveQueryClient.getClient().unsubscribe(QueryHelper.getQuery(), callback); } } 

一段时间后,想到了写我自己的经理来监视订阅的想法,但我从未意识到。

结论


希望本文对您有所帮助。 如果发现任何不正确或错误,请写信给我。 如所承诺的,我将留下一些对我有帮助的良好资源的链接:


祝大家好运!

Source: https://habr.com/ru/post/zh-CN435424/


All Articles