小编use*_*032的帖子

最小的Android前台服务在高端手机上被杀死

我正在尝试创建一个允许用户记录路线(位置/ 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

26
推荐指数
2
解决办法
8112
查看次数

HTTPPost multipart(上传文件)从Java到Python webapp2

我正在尝试将文件上传到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)

python java google-app-engine android flask

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

等待超时的任务

我正在尝试编写一个帮助方法,它允许我传递任意任务和超时.如果任务在超时之前完成,则调用成功委托,否则调用错误委托.该方法如下所示:

    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)

.net c# task async-await

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

C#vs C++ - 类型,继承和vtable

我无法理解导致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)

c# c++ inheritance types object-slicing

3
推荐指数
1
解决办法
1200
查看次数

在mvvmcross中的视图模型之间传递多态类型

我有两个按钮,它们都显示一个新的视图模型,但是传递给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)

c# android mvvmcross xamarin

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

Azure DevOps REST api - 使用变量运行管道

我在 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

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