- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在努力改进我们用于划船社区的应用程序。它的一部分是网站上的 map ,其中包含 Boats 的最近位置。到目前为止一切正常,但我想添加一个持续的背景跟踪作为应用程序功能。
该应用程序可以运行一段时间,但由于超时而无法上传。这些不是来自 API 限制,在我看来,应用程序似乎无法再访问网络。
我依赖https://github.com/jamesmontemagno/GeolocatorPlugin对于所有位置事物。该插件还使用 https://github.com/jamesmontemagno/CurrentActivityPlugin/在安卓系统上。
因此,这是我从手机收到位置更新后所做的事情。
事件处理程序设置:
[...]
TimeSpan span = new TimeSpan(0, 20, 0); // Prod: 0, 30, 0
double distance = 500; // Prod: 2700
bool includeHeading = false; //don't alert on heading changes
ListenerSettings listenerSettings = new ListenerSettings
{
AllowBackgroundUpdates = true,
DeferralDistanceMeters = distance, // adjustable in app 2-10 nautical Miles
DeferLocationUpdates = true,
DeferralTime = span, // adjustable in app 15-120 Minutes
ListenForSignificantChanges = false,
PauseLocationUpdatesAutomatically = false,
ActivityType = ActivityType.OtherNavigation
};
var success = await CrossGeolocator.Current.StartListeningAsync(span,distance,includeHeading,listenerSettings);
if (success)
{
CrossGeolocator.Current.PositionChanged += async (s, e) =>
{
Console.WriteLine("\n\n -_-_-_-_-_ Position Event -_-_-_-_-_-_ \n\n");
Trackpoint trackpoint = new Trackpoint(e.Position);
Trackpoint point = await Tracking(trackpoint);
};
}
[...]
事件处理程序调用:(在应用程序开发路线图的后面会发生更多事情)
public async Task<Trackpoint> Tracking(Trackpoint trackpoint = null)
{
return await tracker.LogPoint(trackpoint);
}
在 tracker.LogPoint(trackpoint)
中,来自 Hevent Handler 的坐标被添加到列表中(该列表应该是空的,但可能包含以前的 Trackpoints,以防上传失败。)
public async Task<Trackpoint> LogPoint(Trackpoint location = null)
{
if (location == null)
{
location = await GetCoordinates(); // Call GPS if no Trackpoint is given when Tracking is done fully manual
}
if (location != null)
{
Console.WriteLine("Trackpoint Queue was: {0}", track.Count);
track.Add(location); // Add current location to end of the list (defined as private in the class)
int trackpointQueue = track.Count;
int uploadedTrackpoints = 0;
Console.WriteLine("Trackpoint Queue now: {0}", trackpointQueue);
foreach (var position in track)
{
Console.WriteLine("Uploading Trackpoint: {0} | {1} | {2}", position.Timestamp, position.Latitude, position.Longitude);
if (App.api.UploadTrackPoint(track[track.Count - 1])) // upload first trackpoint in List (ideally current) and remove it from List, repeat with more items in queue.
{
uploadedTrackpoints++;
}
else
{
Console.WriteLine("Error uploading Trackpoint trying again next time");
// Because uploading attempt failed, we don't want to try again now leave the loop until next call.
break;
}
}
track.RemoveRange(0, uploadedTrackpoints); // remove all uploaded Trackpoints from Queue
}
return location;
}
上传作为现有 API 的 multipart/formdata 发生。在 4-10 个事件之后,所有进一步的上传都失败,由于发生网络超时而引发异常。将应用程序带回前台,它几乎没有响应。
public bool UploadTrackPoint(Trackpoint location)
{
bool success = false;
if (CanUseData())
{
string posturl = settings.BlogURL + "(THE API URL)" + "(THE API KEY)";
string agent = "User-Agent: (MY APP NAME)/" + settings.Version + " (" + DeviceInfo.Platform + ", " + DeviceInfo.VersionString + ")";
Console.WriteLine("Uploading: {0} ", Trackpoint.ConvertToString(location));
try
{
var response = MessageUpload.MultipartFormDataPost(false, posturl, agent, location.Pairs);
Console.WriteLine("HTTP response StatusCode: " + response.StatusCode + "\n Content: " + response.ResponseUri);
if (response.StatusCode == System.Net.HttpStatusCode.OK) success = true;
}
catch (Exception ex)
{
Console.WriteLine("FAILED!!! \n\n({0})\n\n", ex);
}
}
return success;
}
在 iOS(物理 iPhone 6)和 iOS 模拟器以及 Android 模拟器上会发生完全相同的行为。然而,我读了很多关于 iOS 和最近的 Android API 的背景限制,但我怀疑这是这里的问题,因为它在两个平台上都是一致的。所以我假设我在这里做错了什么,在撞墙之前填充了某种缓冲区。但是,应用程序没有被任何操作系统终止,而我可以在控制台上看到一些 -_-_-_-_-_ Position Event -_-_-_-_-_-_
上传开始失败,积压越来越多。最终在一些超时发生后,甚至位置更新也会停止。
您将从哪里开始进一步调试?
最佳答案
以防万一有人偶然发现这个。除了@SushiHangover 提到的缺少后台服务之外,更大的问题是 WebResponse 的处理不正确。
事实证明,碰壁的直觉就在这里:在我的 Http 调用完成后,应用程序只读取 header 并且从不处理响应对象,应用程序保持所有连接打开。在恰好 10(在 iOS 上)之后,应用程序无法打开新连接,导致超时。
关于c# - 一段时间后,在后台(iOS 和 Android)上传数据以一种奇怪的方式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57127063/
从 0 开始搭建一套后台管理系统,成本巨大,所以都会选择一套成熟的组件库,基于此,再堆叠业务逻辑。我们公司的组件库基于 Ant Design。Ant Design 包含一套完整的后台解决方案,不仅
在我的 IOS 应用程序中,我有一个标记为 retain 的 NSDate* 属性 当我的应用程序再次激活时,属性值已被释放。 我是否误解了属性和内存管理的工作原理,我该如何防范? 最佳答案 很明显,
我有一个使用 BackgroundWorker 组件的示例 WinForms 应用程序。它工作正常,但是当我点击 Cancel 按钮取消后台线程时,它并没有取消线程。当我点击 Cancel 按钮调用
我目前正在开发一个应用程序,该应用程序在启动时会对服务器执行 ping 操作,该服务器会为每个连接的设备返回一个唯一标识符。设备每 5 秒从服务器检索另一页以获取一组不同的数据。这个唯一的 ID 可以
我正在开发一个应用程序,当它通过主页按钮在后台按下时,计时器应该启动,当应用程序返回前台并且计时器已经过了一定时间时,应该是执行。 我的问题是 当我的应用程序转到背景/前景? 是否有特殊的方法或其他技
我有 map View ,其中几乎没有 MKPointAnnotation。 一切正常,但是, View 的 MKPoiintAnnotation 的“背景”是“不可见的”,因此不是很“可见”。 我想
我在 iOS 中开发广告数据应用程序。我的应用程序广告数据在前台很好。但我想在 ios 后台宣传信标数据。我设置了背景外设设置。和广告数据 advertisingData = [CBAdvertise
如果我有一组操作,我想根据特定条件在后台工作程序中运行,例如,我有 10 个条件 if(a) BackgroundWorker doA = new backgroundworker() if(
我想独立运行一个函数。从我调用的函数中,我想在不等待其他函数结束的情况下返回。 我试过用 threadind,但这会等待,结束。 thread = threading.Thread(target=my
我想在用户在线时立即执行一些任务,即使他在后台也是如此。我正在使用 Reachability 类来检查互联网。但是当我在后台时,这个类没有通知我。我知道有人早些时候问过这个问题,但没有找到任何解决方案
我在后台播放文本转语音时出现间歇性(哎呀!)问题,由 Apple Watch 触发。我已经正确设置了后台模式、AVSession 类别和 WatchKitExtensionRequest 处理程序。
我有一个相当复杂的程序,所以我不会在这里转储整个程序。这是一个简化版本: class Report { private BackgroundWorker worker; public
我有一个任务在 backgroundworker 中运行。单击开始按钮,用户将启动该过程,并获得一个取消按钮来取消处理。 当用户点击取消时,我想显示一个消息框“进程尚未完成,你想继续吗”。 这里我希望
我有一个按以下方式编码的脚本。我想将它作为后台/守护进程运行,但是一旦我启动脚本,如果我关闭它从程序运行的终端窗口终止。我需要做什么来保持程序运行 loop do pid = fork do
我正在制作一个使用 ActivityRecognition API 在后台跟踪用户 Activity 的应用,如果用户在指定时间段(例如 1 小时)内停留在同一个地方,系统就会推送通知告诉用户去散步.
当尝试使用 URLSession 的 dataTaskPublisher 方法发送后台请求时: URLSession(configuration: URLSessionConfiguration.ba
当我编译这段代码时,我得到了他的错误,对象引用设置为null,错误位置在Dowork中,argumenttest.valueone = 8; public partial class Form1 :
有什么方法可以使用最小化或不活动的应用程序吗?我可以打开我的应用程序,然后打开并使用另一个应用程序,然后按一个按钮来激活我的程序吗? 例如,打开我的应用程序,打开 Safari,按下按钮(F1 或任何
我的具体要求是一个在后台运行的应用程序,被通知显示器即将进入休眠状态或者设备已经或即将达到空闲超时 - 然后唤醒并执行一些(简短的)一段代码。 我在这里找到了有关应用程序被置于后台或暂停的通知的引用:
我有一个 LSUIElement 设置为 1 的应用程序。它有一个内置编辑器,因此我希望该应用程序在编辑器打开时出现在 Cmd+Tab 循环中。 -(void)stepIntoForegrou
我是一名优秀的程序员,十分优秀!