小编Nic*_* A.的帖子

获取用户在Android中的位置的好方法

问题:

尽快将用户的当前位置置于阈值内,同时节省电池电量.

为什么问题是一个问题:

首先,android有两个提供商; 网络和GPS.有时网络更好,有时GPS更好.

"更好"是指速度与准确度之比.
如果我几乎可以立即获得位置并且不打开GPS,我愿意牺牲几米精度.

其次,如果您要求更新位置更改,则在当前位置稳定时不会发送任何内容.

谷歌有一个确定"最佳"位置的例子:http://developer.android.com/guide/topics/location/obtaining-user-location.html#BestEstimate
但我认为它不是应该尽可能好的地方/可能.

我有点困惑为什么谷歌没有标准化的位置API,开发者不应该关心位置来自哪里,你应该只指定你想要的东西,手机应该为你选择.

我需要帮助的是:

我需要找到一个很好的方法来确定"最佳"位置,也许是一些启发式或者可能通过某些第三方库.

这并不意味着确定最好的提供商!
我可能会使用所有提供商并选择其中最好的.

应用程序的背景:

该应用程序将以固定间隔收集用户的位置(假设每10分钟左右)并将其发送到服务器.
该应用程序应尽可能节省电池,并且位置应具有X(50-100?)米的精度.

目标是以后能够在地图上绘制白天用户的路径,因此我需要足够的准确性.

其他:

您认为对于期望和接受的准确度的合理价值是什么?
我一直在使用100米接受,并且根据需要使用30米,这要问多少?
我希望以后能够在地图上绘制用户的路径.
期望100米,接受500米更好吗?

此外,现在我每次更新GPS的时间最长为60秒,如果你在室内的准确度可能超过200米,这个位置太短了吗?


这是我目前的代码,感谢任何反馈(除了缺少错误检查,这是TODO):

protected void runTask() {
    final LocationManager locationManager = (LocationManager) context
            .getSystemService(Context.LOCATION_SERVICE);
    updateBestLocation(locationManager
            .getLastKnownLocation(LocationManager.GPS_PROVIDER));
    updateBestLocation(locationManager
            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER));
    if (getLocationQuality(bestLocation) != LocationQuality.GOOD) {
        Looper.prepare();
        setLooper(Looper.myLooper());
        // Define a listener that responds to location updates
        LocationListener locationListener = new LocationListener() {

            public void onLocationChanged(Location location) {
                updateBestLocation(location);
                if (getLocationQuality(bestLocation) != LocationQuality.GOOD)
                    return;
                // We're done …
Run Code Online (Sandbox Code Playgroud)

android geolocation android-location

210
推荐指数
5
解决办法
14万
查看次数

关于Android中高性能绘图的提示

背景

我正在为一个Android应用程序编写一个图形库(是的,我知道有很多,但没有提供我们需要的可定制性).

我希望图表可以缩放和平移.

问题

我希望体验顺畅,留下小巧的CPU占用空间.

解决方案

View.onDraw():

优点

  • 一些易于实现的东西

缺点

  • 表现不好?(除非它使用OpenGL,是吗?)

位图:

优点

  • 真的很容易实现
  • 很好的表现;很好的绩效

缺点

  • 必须使用丑陋的缩放

OpenGL的:

优点

  • 可能性能很好,取决于我的实现

缺点

  • 更多工作要实施

最后的话

OpenGL可能是专业的解决方案,肯定会提供更多的灵活性,但它需要更多的工作(多少不清楚).

有一点在OpenGL中更容易实现平移/缩放,因为我可以操纵矩阵来使其正确,其余的应该更难,尽管我认为.

我不怕弄脏手,但我想知道在开始挖掘之前我正朝着正确的方向前进.

我错过了任何解决方案吗?我所有的解决方案都理智吗?


补充说明:

我可以补充一点,当图形发生变化时,我希望对变化进行动画处理,这可能是最苛刻的任务.

performance android drawing rendering opengl-es

17
推荐指数
1
解决办法
3365
查看次数

在不使用CTest的情况下使用CMake构建测试

这是我想要做的:

  • 键入make all将构建我的库和它的文档.
  • 键入make test将构建我的lib(如果需要),gtest然后我的测试
  • 如果需要,键入make check运行make test然后运行可执行文件

现在我只是设法让第一个工作.我遇到的问题是有条件包括gtest.

Gtest使用CMake这很好,理论上我需要做的就是包含gtest目录add_subdirectory但是gtest将始终构建.

我现在的结构是:

CMakeLists.txt     (Here I add targets for doc and the library)
doc                (my doxygen docs)
include            (my headers)
lib                (where my compiled libraries go)
src                (where my .cpp files go)
test
    CMakeLists.txt (Here I add targets for gest and my tests)
    bin            (where the test executable will go)
    contrib        (where gtest is)
    src            (my tests)

我试图弄清楚如何将gtest作为依赖项添加到test-target但不是每次都构建gtest.

我真的很生气,而且关于学习CMake的信息几乎没有,所以如果有人知道任何深入的教程(可以在互联网上免费获得)那将是非常棒的.

cmake googletest

11
推荐指数
1
解决办法
2876
查看次数

Heroku总是运行资产:使用Rails 3.2的生产环境进行预编译

我将Heroku环境设置为暂存,但我的资产始终在生产环境中编译.

这是heroku config:

GEM_PATH            => vendor/bundle/ruby/1.9.1
LANG                => en_US.UTF-8
PATH                => bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin
RACK_ENV            => staging

我在production.rb文件中添加了一个例外,因此我知道在编译资产时它正在运行哪个环境.服务器启动只是正常运行heroku run console显示我正在运行升级.

它只是在运行时assets:precompile始终处于生产阶段.

如果需要,我很乐意发布任何其他配置文件.

我可以补充一点,我在Heroku上运行Rails 3.2.2和Cedar堆栈


输出来自heroku run rake about:

About your application's environment
Ruby version             1.9.2 (x86_64-linux)
RubyGems version         1.3.7
Rack version             1.4
Rails version            3.2.2
JavaScript Runtime       therubyracer (V8)
Action Pack version      3.2.2
Active Support version   3.2.2
Middleware               Rack::Cache, ActionDispatch::Static, Rack::Lock, #, Rack::Runtime, Rack::Auth::Basic, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Callbacks, ActionDispatch::Cookies, …

ruby-on-rails heroku ruby-on-rails-3 asset-pipeline

11
推荐指数
1
解决办法
4280
查看次数

在Java/Android中更快地检测到损坏的套接字

背景

我的应用程序从手机收集数据并将其发送到远程服务器.
数据首先存储在内存中(或者当文件足够大时存储在文件中),每隔X秒左右,应用程序就会刷新该数据并将其发送到服务器.

关键是每一条数据都成功发送,我宁愿发送两次数据而不是发送数据.

问题

作为测试,我将应用程序设置为每5秒发送一个带有时间戳的数据,这意味着服务器上每5秒出现一个新行.
如果我杀了服务器,我希望线路停止,现在应该将它们写入内存.

当我再次启用服务器时,我应该能够确认没有任何事件丢失.

然而问题是,当我杀死服务器时,IO操作开始失败大约需要20秒,这意味着在这20秒内,应用程序会愉快地发送事件并将其从内存中删除,但它们永远不会到达服务器并永远丢失.

我需要一种方法来确保数据实际到达服务器.

这可能是最基本的TCP问题之一,但并非如此,我还没有找到任何解决方案.

我试过的东西

附加信息

我无法改变服务器如何响应意味着我无法告诉服务器确认数据(不仅仅是TCP的机制),服务器只是默默地接受数据而不发回任何东西.

代码片段

课程初始化:

socket = new Socket(host, port);
socket.setTcpNoDelay(true);
Run Code Online (Sandbox Code Playgroud)

数据发送的位置:

while(!dataList.isEmpty()) {
    String data = dataList.removeFirst();
    inMemoryCount -= data.length();
    try {
        OutputStream os = socket.getOutputStream();
        os.write(data.getBytes());
        os.flush();
    }
    catch(IOException e) {
        inMemoryCount += data.length();
        dataList.addFirst(data);
        socket = null;
        return false;
    }
}

return true;
Run Code Online (Sandbox Code Playgroud)

更新1

我再说一遍,我无法改变服务器的行为方式.
它通过TCP和UPD接收数据,并且不会发送任何数据以确认接收.这是一个事实,并且在一个完美的世界中,服务器会确认数据,但这根本不会发生.


更新2

Fraggle发布的解决方案非常完美(关闭套接字并等待输入流关闭).

然而,这带来了一系列新问题.
由于我在手机上,我必须假设用户无法发送无限量的字节,并且我希望尽可能将所有数据流量保持在最低限度.

我不担心打开一个新套接字的开销,这几个字节不会有所作为.然而,我担心的是,每次我连接到服务器时,我都必须发送一个短字符串来标识我是谁.

字符串本身不是那么长(大约30个字符)但如果我经常关闭并打开套接字会增加.

一种解决方案只是每隔X字节"刷新"一次数据,问题是我必须明智地选择X; 如果太大,如果套接字发生故障,将发送过多的重复数据,如果它太小,则开销太大.


最后更新

我的最终解决方案是通过每X字节关闭它来"刷新"套接字,如果一切都不顺利,那么X字节将再次发送.

这可能会在服务器上创建一些重复事件,但可以在那里进行过滤.

java networking android tcp

10
推荐指数
1
解决办法
7217
查看次数

与backbone.js创建链接的首选方式

我试图将我的头围绕在backbone.js上,但由于缺乏(IMO)良好的例子,我发现它很难.

首先,获取对象链接的最佳方法是什么.
如果我想获得Album我能做的模型的编辑网址album.url() + '/edit',这真的是最好的方法吗?

此外,我正在尝试使我的应用程序100%没有javascript工作,所以我不希望我的URL /链接说/albums/#1/edit,我希望它是/albums/1/edit在JS中覆盖它.

我想我创建普通的URL并jQuery.live用来调用router.navigatebackbone.js
我从来没有这个工作,但是,当我调用router.navigate('/albums/2', true)URL更改但我的show动作从未被调用.如果我刷新它的名字,那么路线就匹配了.

我错过了什么?

backbone.js

10
推荐指数
2
解决办法
9647
查看次数

ruby中的并行HTTP请求

我有一系列的URL,我不想打开每个URL并获取一个特定的标签.
但我希望同时做到这一点.

这是我想要做的伪代码:

urls = [...]
tags = []
urls.each do |url|
  fetch_tag_asynchronously(url) do |tag|
    tags << tag
  end
end
wait_for_all_requests_to_finish()

如果这可以以一种非常好的安全方式完成,那将是非常棒的.
我可以使用线程,但它看起来不像数组在ruby中是线程安全的.

ruby parallel-processing asynchronous httprequest

10
推荐指数
2
解决办法
1万
查看次数

Android中外部存储上的SQLite性能不佳

我正在使用外部存储器在等待发送到服务器时将事件存储在数据库中.

我在插入记录时看到了非常糟糕的表现.我知道外部存储器可能很慢,但我想看到一些数字,所以我写了一个测试它的小应用程序.

这是代码:

public static final int INSERTS = 100;

File dbFile = new File(Environment.getExternalStorageDirectory(), "test.sqlite3");
// File dbFile = new File(getFilesDir(), "test.sqlite3");
dbFile.delete();

SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);

db.execSQL("CREATE TABLE events (_id integer primary key autoincrement, event_type TEXT NOT NULL, timestamp BIGINT, data TEXT);");
db.execSQL("CREATE INDEX mainIndex ON events (event_type, timestamp ASC);");

InsertHelper helper = new InsertHelper(db, "events");

final int eventTypeCol = helper.getColumnIndex("event_type");
final int timestampCol = helper.getColumnIndex("timestamp");
final int dataCol = helper.getColumnIndex("data");

long start = System.currentTimeMillis();

String eventType …
Run Code Online (Sandbox Code Playgroud)

sqlite android database-performance

7
推荐指数
1
解决办法
3079
查看次数

图片与照片与图片 - 命名模型

我正在写一个画廊,我的目标不仅仅是照片,而是各种各样的图像都在那里.

现在是命名部分,我的名字是什么?
照片给人的感觉是它只适用于照片.图片为任何图形良好的一个词,但创建图像时,最初使用东西,就像一个人或一所房子.

那么最有意义的是什么:

  • 图片
  • 照片
  • 图片

naming

7
推荐指数
1
解决办法
3150
查看次数

在python中创建版本化库

我们正在建立新的分支机构,所有分支都将共享相同的库.

这样做的问题是,如果我们更新一个库,您可能会破坏所有未更新的应用程序.

因此,我们想对我们的库进行版本控制.
我计划这样做的方式就是这样

loader.load(name='mylib', version='1.0')
Run Code Online (Sandbox Code Playgroud)

或者像这样:

import mylib
mylib.load(version='1.0')
Run Code Online (Sandbox Code Playgroud)

问题是这个装载机如何工作.
天真的方法是将每个版本放在自己的文件夹中,但问题是,如果所有版本中都存在常见错误,则每个版本都需要单独修复.

稍微好一点的方法(可维护性)是将库的所有版本放在同一个文件中,并调用一些加载函数来创建函数链接.我不知道这有多漂亮(我们可能最终得到几千行的怪物文件,我们当然可以删除旧的,未使用的版本).

为了帮助保持版本数量的减少,我打算只在我打破兼容性时增加版本号,而不是在修复错误或添加新内容时.

有没有这样的内置到python或任何其他方法可以工作?

有没有人有这种东西的经验?


我可以补充一点,使用libs的东西都是测试用例,我们只是希望测试人员进入分支并运行./testit.py,没有别的.


解决方案基于Gringo Suave的建议.

class MyClass_1_0:
    def func1(self):
        return 'Baz'

    def func2(self):
        return 'Bar'

class MyClass_1_1(MyClass_1_0):
    # Overwriting a function:
    def func1(self):
        return 'Foo'

    # Definining a new function which uses a function
    # from a previous version:
    def func3(self):
        print("{} {}".format(self.func1(), self.func2()))

# Change this to the latest version for stuff that always wants the latest
class MyClass(MyClass_1_1): pass
Run Code Online (Sandbox Code Playgroud)

用法示例:

>>> from my.module …
Run Code Online (Sandbox Code Playgroud)

python versioning

6
推荐指数
1
解决办法
869
查看次数