我正在尝试创建一个允许用户记录路线(位置/ GPS)的应用程序.为了确保即使屏幕关闭也会记录位置,我已经foreground service为位置记录创建了一个.我将位置存储在一个Room Database注入我的服务中的位置Dagger2.
但是,这项服务被Android杀死,当然这并不好.我可以订阅低内存警告,但这并没有解决我的服务在运行Android 8.0的现代高端手机上大约30分钟后被杀的根本问题
我创建了一个只有"Hello world"活动和服务的最小项目:https://github.com/RandomStuffAndCode/AndroidForegroundService
该服务在我的Application课程中启动,路由记录通过以下方式启动Binder:
// Application
@Override
public void onCreate() {
super.onCreate();
mComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
Intent startBackgroundIntent = new Intent();
startBackgroundIntent.setClass(this, LocationService.class);
startService(startBackgroundIntent);
}
// Binding activity
bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
// mConnection starts the route logging through `Binder` once connected. The binder calls startForeground()
Run Code Online (Sandbox Code Playgroud)
我可能不需要BIND_AUTO_CREATE旗帜,我一直在测试不同的旗帜,试图不让我的服务被杀 - 到目前为止没有运气.
使用分析器看起来我没有任何内存泄漏,内存使用率稳定在~35mb:
使用adb shell dumpsys activity …
android android-service android-location android-lifecycle android-doze
我正在尝试将文件上传到GAE - 服务器端代码:
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads('file')
blob_info = upload_files[0] # When using flask, request.files[0] gives correct output.
self.response.out.write('/serve/%s' % blob_info.key())
Run Code Online (Sandbox Code Playgroud)
使用HTML,我可以让它工作:
upload_url = blobstore.create_upload_url('/upload')
self.response.out.write('<html><body>')
self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url)
self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit"
name="submit" value="Submit"> </form></body></html>""")
Run Code Online (Sandbox Code Playgroud)
但我必须能够从Java执行多部分发布请求.我有一个烧瓶项目托管在openshift (烧瓶,request.files[0]而不是),其中Java代码似乎工作:
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
DefaultHttpClient mHttpClient = new DefaultHttpClient(params);
HttpPost httppost = new HttpPost(getString(R.string.url_webservice) + "/upload");
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("file", new FileBody(new File(path)));
httppost.setEntity(multipartEntity);
mHttpClient.execute(httppost, …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个帮助方法,它允许我传递任意任务和超时.如果任务在超时之前完成,则调用成功委托,否则调用错误委托.该方法如下所示:
public static async Task AwaitWithTimeout(Task task, int timeout, Action success, Action error)
{
if (await Task.WhenAny(task, Task.Delay(timeout)) == task)
{
if (success != null)
{
success();
}
}
else
{
if (error != null)
{
error();
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在这似乎在大部分时间都有效,但我也想写一些测试以确保.令我意外的是,此测试失败了,并调用错误委托而不是成功:
var taskToAwait = Task.Delay(1);
var successCalled = false;
await TaskHelper.AwaitWithTimeout(taskToAwait, 10, () => successCalled = true, null);
Assert.IsTrue(successCalled);
Run Code Online (Sandbox Code Playgroud)
但是,此测试为绿色:
var taskToAwait = Task.Run(async () =>
{
await Task.Delay(1);
});
var successCalled = false;
await TaskHelper.AwaitWithTimeout(taskToAwait, 10, () …Run Code Online (Sandbox Code Playgroud) 我无法理解导致C++和C#之间差异的原因.
首先,我们有一个基类包含虚函数的示例.
class Base
{
protected:
int super;
public:
virtual int f() = 0;
};
class Derived : public Base
{
public:
int extraA;
int f(){ return 1; }
};
int main()
{
Derived *d = new Derived();
std::vector<Base*> v;
v.push_back(d);
for(int i=0; i < v.size() ;i++)
{
// Output "Derived"
std::cout << typeid(*v[i]).name() << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这个输出是"派生的".
如果我们删除f(),这将不再有效.输出是"Base".例:
class Base
{
protected:
int super;
};
class Derived : public Base
{
public:
int extraA;
};
int …Run Code Online (Sandbox Code Playgroud) 我有两个按钮,它们都显示一个新的视图模型,但是传递给viewmodel的数据不同.传递的数据并不完全不同,因此它们都从相同的基础继承.不幸的是,似乎传递给viewmodel的Init()方法的数据在途中丢失了它的运行时类型信息?使用调试器(或代码),传递的数据仅被识别为基类 - 而不是实际构造并传递给ShowViewModel <>()方法的派生类.
是什么我试图不可能?
public class BasePasser
{
}
public class PasserA : BasePasser
{
}
public class PasserB : BasePasser
{
}
public class ViewModelOne : MvxViewModel
{
// ...
private void DoSwitchViewModelA()
{
var tobepassed = new PasserA {
// ...
};
ShowViewModel<ViewModelTwo>(tobepassed);
}
private void DoSwitchViewModelB()
{
var tobepassed = new PasserB {
// ...
};
ShowViewModel<ViewModelTwo>(tobepassed);
}
}
public class ViewModelTwo : MvxViewModel
{
// ...
public async Task Init(BasePasser passed)
{
if(passed …Run Code Online (Sandbox Code Playgroud) 我在 Azure Devops 上有一个管道,我正在尝试使用 REST api 以编程方式/无头方式运行:https ://docs.microsoft.com/en-us/rest/api/azure/devops/pipelines/runs/run% 20pipeline?view=azure-devops-rest-6.0
到目前为止一切顺利,我可以进行身份验证并开始运行。我想将数据传递到这个管道,文档建议可以variables在请求正文中使用。我的请求正文:
{
"variables": {
"HELLO_WORLD": {
"isSecret": false,
"value": "HelloWorldValue"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的管道 YAML 如下所示:
trigger: none
pr: none
pool:
vmImage: 'ubuntu-latest'
steps:
- task: Bash@3
inputs:
targetType: 'inline'
script: |
KEY=$(HELLO_WORLD)
echo "Hello world key: " $KEY
Run Code Online (Sandbox Code Playgroud)
然而,这给了我一个错误“HELLO_WORLD:找不到命令”。
我尝试向管道添加“HELLO_WORLD”变量并启用“让用户在运行此管道时覆盖此值”设置。这导致HELLO_WORLD变量不再是未知的,而是它停留在其初始值上,并且在我使用 REST api 触发运行时未设置
如何使用 REST api 将变量传递给管道?仅为特定的运行/构建设置变量值很重要
我找到了另一个 API 来运行构建,但似乎您不能使用个人访问令牌身份验证,就像您可以使用管道 api - 仅 OAuth2 - https://docs.microsoft.com/en-us/rest/ api/azure/devops/build/builds/queue?view=azure-devops-rest-6.0
azure-devops azure-devops-extensions azure-devops-rest-api azure-devops-pipelines
android ×3
c# ×3
.net ×1
android-doze ×1
async-await ×1
azure-devops ×1
c++ ×1
flask ×1
inheritance ×1
java ×1
mvvmcross ×1
python ×1
task ×1
types ×1
xamarin ×1