如何在Android Studio中运行Hipster纯Java库实现Dijkstra算法?
解决Android Studio中Hipster库Dijkstra结果显示问题及室内导航替代方案
我来帮你梳理问题根源并给出修复方案,同时推荐几个适合商场室内导航的替代选择:
1. 错误原因拆解
你遇到的Cannot resolve method 'makeText(...)'报错,其实是两个小问题叠加导致的:
- 参数类型不匹配:你调用
search('L')时传的是字符类型char,但你的图节点都是字符串(比如"A"、"B"),Hipster的search方法要求参数和节点类型完全一致,这个类型不匹配会引发编译错误,进而导致后续的toString()调用也无法被正确识别。 - Context初始化时机错误:你在Activity的成员变量位置直接调用
getApplicationContext(),此时Activity还未完成初始化,上下文对象是null,这也会导致Toast的方法调用不合法。
2. 代码修复步骤
按照下面的调整修改你的代码,就能解决问题:
第一步:修正节点参数类型
把search('L')改成search("L"),和你定义的字符串节点类型保持一致。
第二步:正确获取Context
将Context的获取移到onCreate方法内部,直接用Find_Shortst_Path.this(或者简化的this)作为Toast的上下文参数——此时Activity已经初始化完成,上下文是有效的。
修改后的完整代码片段
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_find__shortst__path); TextView helloTextView = (TextView)findViewById(R.id.myTextView); // 图构建代码保持不变 HipsterGraph<String,Double> graph = GraphBuilder.<String,Double>create() .connect("A").to("B").withEdge(2d) .connect("A").to("C").withEdge(2d) .connect("A").to("D").withEdge(2d) .connect("B").to("E").withEdge(5d) .connect("B").to("F").withEdge(10d) .connect("B").to("G").withEdge(5d) .connect("B").to("H").withEdge(10d) .connect("C").to("I").withEdge(5d) .connect("C").to("J").withEdge(10d) .connect("C").to("K").withEdge(5d) .connect("K").to("L").withEdge(5d) .createUndirectedGraph(); SearchProblem p = GraphSearchProblem .startingFrom("A") .in(graph) .takeCostsFromEdges() .build(); // 先获取结果并转为字符串,更清晰也方便调试 Algorithm.SearchResult result = Hipster.createDijkstra(p).search("L"); String resultText = result.toString(); // 用Activity上下文显示Toast和更新TextView Toast.makeText(Find_Shortst_Path.this, resultText, Toast.LENGTH_LONG).show(); helloTextView.setText(resultText); }
修改后编译错误会消失,Toast和TextView也能正常显示路径结果。
3. 室内导航路径规划替代方案
如果你是做商场内找物品的功能,除了Hipster库,还有几个更贴合场景的选择:
- 自己实现Dijkstra算法:Dijkstra核心逻辑简单,用邻接表存储商场节点(店铺、路口)和边(路径长度),自己编写可以灵活适配楼层信息、路径权重(比如避开拥挤区域),完全不依赖第三方库,调试也更自由。
- Google Maps Indoor API:如果目标商场已接入谷歌室内地图,直接用这个API能快速实现室内路径规划,自带地图渲染和导航功能,适合商用场景。
- GraphHopper:开源路径规划库,支持Dijkstra、A*等多种算法,有专门的Android适配版本,文档完善,适合自定义地图数据的场景。
- OSRM (Open Source Routing Machine):适合大规模、复杂的室内地图数据,可部署自有服务或调用公共API,支持批量路径计算。
内容的提问来源于stack exchange,提问作者Ireshan M Pathirana
相关产品推荐
相关产品推荐

