小编jcs*_*nt0的帖子

ContentProvider insert()总是在UI线程上运行?

我有一个应用程序需要从服务器提取数据并将其插入SQLite数据库以响应用户输入.我认为这很简单 - 从服务器提取数据的代码是AsyncTask的一个相当简单的子类,它完全按照我的预期工作,而不会挂起UI线程.我使用一个简单的接口为它实现了回调功能,并将其包装在一个静态类中,所以我的代码如下所示:

MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() {
    @Override
    public void onFolderContentsResponse(final List<FilesystemEntry> contents) {
        // do something with contents
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都还不错.即使服务器需要一个小时来检索数据,UI仍然可以顺利运行,因为getFolderContents中的代码在AsyncTask的doInBackground方法中运行(该方法与UI分开).在getFolderContents方法的最后,调用onFolderContentsResponse并传递从服务器接收的FilesystemEntry列表.我只是真的说了这一切,所以我希望很清楚我的问题不在getFolderContents方法或我的任何网络代码中,因为它不会在那里发生.

当我尝试通过onFolderContentsResponse方法中的ContentProvider子类插入数据库时​​出现问题; 在执行该代码时,UI总是挂起,这使我相信尽管从AsyncTask的doInBackground方法调用,插入仍然在UI线程上运行.以下是有问题的代码:

MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() {
    @Override
    public void onFolderContentsResponse(final List<FilesystemEntry> contents) {
        insertContentsIntoDB(contents);
    }
}
Run Code Online (Sandbox Code Playgroud)

insertContentsIntoDB方法:

void insertContentsIntoDB(final List<FilesystemEntry> contents) {
    for (FilesystemEntry entry : contents) {
        ContentValues values = new ContentValues();
        values.put(COLUMN_1, entry.attr1);
        values.put(COLUMN_2, entry.attr2);
        // etc.

        mContentResolver.insert(MyContentProvider.CONTENT_URI, values);
    }
}
Run Code Online (Sandbox Code Playgroud)

其中mContentResolver先前已设置为getContentResolver()方法的结果.

我已经尝试将insertContentsIntoDB放在自己的Thread中,如下所示:

MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() {
    @Override
    public void onFolderContentsResponse(final List<FilesystemEntry> contents) { …
Run Code Online (Sandbox Code Playgroud)

java user-interface multithreading android android-contentresolver

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

应用具有Ints或Doubles参数的函数

我对Haskell很新,所以我希望这不是一个愚蠢的问题.我有这种数据类型:

data N = I Int | D Double deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用签名编写一个函数,该函数(Num a) => (a -> a -> a) -> N -> N -> N将函数应用于Ns中的数字,并返回带有结果的N. 如果Ns都是Ds,它应该只应用函数并返回一个D; 如果一个人是一个I,另一个是D,它应该转换IntIDouble,应用功能,两个DoubleS,并返回一个D; 如果两者都是Is,它应该应用该函数并返回一个I.这是我到目前为止(破碎)的代码:

widen :: N -> N -> (N, N)
widen (I i) d@(D _) = (D (fromIntegral i), d)
widen d@(D _) i@(I _) …
Run Code Online (Sandbox Code Playgroud)

haskell types

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

是否可以在 C# DataColumn.Expression 中的 SUM 中使用 IIF?

这是我试图评估的表达式:

Sum(IIF(QUALITY<=9.0,1.0,0.0))
Run Code Online (Sandbox Code Playgroud)

问题是

string expr = "Sum(IIF(QUALITY<=9.0,1.0,0.0))";
dataTable.Compute(expr, "")
Run Code Online (Sandbox Code Playgroud)

抛出一个错误说

Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier.
Run Code Online (Sandbox Code Playgroud)


主要的挑战是我无法手动重写表达式,因为它以 RDL 文件中的字符串形式出现在我的程序中,所以它最初看起来像

Sum(IIF(Fields!QUALITY.Value<=9.0,1.0,0.0))
Run Code Online (Sandbox Code Playgroud)

并且我的程序需要自动将其转换为一个字符串,该字符串在传递给dataTable.Compute(). 我从 Microsoft 的 Compute 方法文档中确定 C# 不喜欢“字段!” 或语法的“.Value”部分,通过删除它们,我可以使更简单的表达式正常工作;例如,这些语句都返回预期值:

dataTable.Compute("Sum(QUALITY)");
dataTable.Compute("Count(QUALITY)");
Run Code Online (Sandbox Code Playgroud)


有可能做我想做的事吗?我觉得我应该只需要在某个地方稍微改变语法才能让它工作,但我一直无法在互联网上找到答案,这让人非常沮丧。

以下是我迄今为止尝试过的一些方法,但无济于事:

Sum(IIF([QUALITY]<=9.0,1.0,0.0))
Sum(Convert(IIF(QUALITY<=9.0,1.0,0.0), 'System.Double'))
Sum(IIF(Convert(QUALITY, 'System.Double')<=9.0,1.0,0.0))    
Run Code Online (Sandbox Code Playgroud)

c# datatable sum iif

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

给定函数的位置参数的名称,可以确定参数的位置吗?

我正在研究玩具Python类型检查器,使用Python 3中的函数注释功能来定义函数参数和返回值的类型,我似乎在检查一个函数类型是否是另一个函数类型的子类型时遇到了问题.采取这两个功能:

def f(x: int, y: int) -> type(None):
    pass

def g(a: object, b: int) -> type(None):
    pass
Run Code Online (Sandbox Code Playgroud)

我想让我的代码确定类型g是一个类型的子类型f(因为每个f参数的类型是g参数列表中相同索引处参数类型的子类型,并且返回type g是返回类型的子类型f).但是,该__annotations__字段是字典:

f.__annotations__ == { 'x': int, 'y': int, 'return': type(None) }
Run Code Online (Sandbox Code Playgroud)

这意味着它没有向我提供我认为需要的参数排序信息.是否有一种可靠的方法来确定这x是第一个参数f,只是检查运行时属性f

python python-3.x

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