小编Hen*_*son的帖子

Android的换行小部件布局

我正在尝试创建一个向用户显示一些数据的活动.数据可以分为"单词",每个单词都是一个小部件,"单词"序列将形成数据("句子"?),包含单词的ViewGroup小部件.由于"句子"中所有"单词"所需的空间将超过显示器上的可用水平空间,我想像正常的文本一样包装这些"句子".

以下代码:

public class WrapTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout l = new LinearLayout(this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(
                new ViewGroup.MarginLayoutParams(
                        LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
        mlp.setMargins(0, 0, 2, 0);

        for (int i = 0; i < 10; i++) {
            TextView t = new TextView(this);
            t.setText("Hello");
            t.setBackgroundColor(Color.RED);
            t.setSingleLine(true);
            l.addView(t, mlp);
        }

        setContentView(l, lp);
    }
}
Run Code Online (Sandbox Code Playgroud)

产生类似左图的东西,但我想要一个布局呈现相同的小部件,如右图所示.

非包装

包皮

是否有布局或布局和参数的组合,还是我必须为此实现自己的ViewGroup?

java layout user-interface android

95
推荐指数
6
解决办法
5万
查看次数

在java中将任何对象转换为字节数组

我有一个X类型的对象,我希望在将它发送到S3存储之前将其转换为字节数组.谁能告诉我怎么做?我感谢您的帮助.

java serialization bytearray

48
推荐指数
3
解决办法
14万
查看次数

我应该练习"模仿者"还是"经典"TDD?

我读过(并重新阅读)Martin Fowler的Mocks Are not Stubs.在其中,他定义了两种不同的TDD方法:"古典"和"模仿者".他试图回答" 我应该成为一个古典主义者还是一个嘲笑者? "这个问题,但他承认他从来没有尝试过模仿者TDD,而不仅仅是"玩具".所以我想我会问这个问题.好的答案可能会重复福勒的论点(但希望更清楚)或添加他没有想到的论点,或者其他人提出的论点,因为福勒上次在2007年1月更新了这篇论文.

tdd mocking

38
推荐指数
4
解决办法
6083
查看次数

指定Android项目依赖项(在Eclipse中)

我有两个Android项目,一个包含自定义布局的"库项目",以及一个包含使用该布局的应用程序的"应用程序项目".

除了可视布局编辑器抛出一个ClassNotFoundException(我认为这是插件中的一个错误)之外,所有东西似乎都构建并执行得很好,但是当我尝试开始使用我为自定义布局定义的属性时xml,我再也无法构建了.那是; 这工作:

<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
  <TextView
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="asdfasdf"
    />
</se.fnord.android.layout.PredicateLayout>
Run Code Online (Sandbox Code Playgroud)

然而,这不是:

<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fnord="http://schemas.android.com/apk/res/se.fnord.android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
  <TextView
    fnord:layout_horizontalSpacing="1px"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="asdfasdf"
    />
</se.fnord.android.layout.PredicateLayout>
Run Code Online (Sandbox Code Playgroud)

构建失败,来自aapt的消息:

错误在包'se.fnord.android'中找不到属性'layout_horizo​​ntalSpacing'的资源标识符

资源标识符确实存在于R文件中,而attrs.xml包含库项目,如果我将布局代码和资源直接放在应用程序项目中,一切正常.layout_horizo​​ntalSpacing属性(和layout_verticalSpacing)是PredicateLayout.LayoutParam类中使用的自定义属性,用于指定到下一个窗口小部件的距离.

到目前为止,我已经通过指定项目引用和构建路径项目依赖项来尝试标准的eclipse方法.我还被告知在应用程序清单中尝试标记,但没有帮助.

那么,我需要做什么才能使xml文件中的引用有效?

我不知道它是否相关,但'library'清单看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="se.fnord.android"
      android:versionCode="1" android:versionName="1.0.0">
</manifest>
Run Code Online (Sandbox Code Playgroud)

"应用程序"显示如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="se.fnord.appname"
      android:versionCode="1" android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AppName"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

(在"PredicateLayout",顺便说一句,是的清理后的版本).

eclipse dependencies android

21
推荐指数
3
解决办法
4万
查看次数

如何加快PostgreSQL中的更新/替换操作?

我们有一个相当特殊的应用程序,它使用PostgreSQL 8.3作为存储后端(使用Python和psycopg2).我们对重要表执行的操作在大多数情况下都是插入或更新(很少删除或选择).

出于理智的原因,我们已经创建了我们自己的数据映射器层,它运行得相当好,但它有一个很大的瓶颈,即更新性能.当然,我不希望更新/替换场景像'插入空表'那样快速,但是接近它会很好.

请注意,此系统没有并发更新

我们总是在更新中设置每行的所有字段,这可以在我在测试中使用"替换"一词的术语中看到.到目前为止,我已经尝试了两种解决更新问题的方法:

  1. 创建一个replace()需要更新行数组的过程:

    CREATE OR REPLACE FUNCTION replace_item(data item[]) RETURNS VOID AS $$
    BEGIN
        FOR i IN COALESCE(array_lower(data,1),0) .. COALESCE(array_upper(data,1),-1) LOOP
           UPDATE item SET a0=data[i].a0,a1=data[i].a1,a2=data[i].a2 WHERE key=data[i].key;
        END LOOP;
    END;
    $$ LANGUAGE plpgsql
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个insert_or_replace规则,以便除偶尔删除之外的所有内容都成为多行插入

    CREATE RULE "insert_or_replace" AS
        ON INSERT TO "item"
        WHERE EXISTS(SELECT 1 FROM item WHERE key=NEW.key)
        DO INSTEAD
            (UPDATE item SET a0=NEW.a0,a1=NEW.a1,a2=NEW.a2 WHERE key=NEW.key);
    
    Run Code Online (Sandbox Code Playgroud)

这两者都加快了更新速度,虽然后者减慢了插入量:

Multi-row insert           : 50000 items inserted in  1.32 seconds averaging 37807.84 items/s
executemany() …
Run Code Online (Sandbox Code Playgroud)

python sql postgresql psycopg2

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

大多数pythonic计算匹配元素的方法是可迭代的

我有一个可迭代的条目,我想收集一些简单的统计数据,比如可以被2整除的所有数字的数量以及可被3整除的所有数字的数量.

我的第一个选择,虽然只迭代列表一次并避免列表扩展(并保持拆分循环重构),看起来相当臃肿:

(alt 1)

r = xrange(1, 10)

twos = 0
threes = 0

for v in r:
  if v % 2 == 0:
    twos+=1
  if v % 3 == 0:
    threes+=1

print twos
print threes
Run Code Online (Sandbox Code Playgroud)

这看起来相当不错,但是有将表达式扩展到列表的缺点:

(alt 2)

r = xrange(1, 10)

print len([1 for v in r if v % 2 == 0])
print len([1 for v in r if v % 3 == 0])
Run Code Online (Sandbox Code Playgroud)

我真正喜欢的是像这样的函数:

(alt 3)

def count(iterable):
  n = 0
  for i in …
Run Code Online (Sandbox Code Playgroud)

python list-comprehension

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

伪代码编程过程与测试驱动开发

对于那些没有阅读过代码完成2的人来说,伪代码编程过程基本上是一种设计例程的方法,首先用简单的英语描述它,然后逐步修改为更详细的伪代码,最后编写代码.这样做的主要好处是通过自上而下而不是自下而上构建系统来帮助您保持正确的抽象级别,从而在不同的层中构建一个干净的API.我发现TDD在这方面效果较差,因为它过于注重做最低限度的测试以通过并鼓励一点点前期设计.我还发现,必须为不稳定的代码(不断重构的代码)维护一套单元测试是非常困难的,因为通常情况下你需要对例程进行十几次单元测试,只需要一次或两次.当您进行重构时 - 例如更改方法签名 - 您所做的大部分工作是更新测试而不是更新prod代码.在组件的代码稳定了一点之后,我更喜欢添加单元测试.

我的问题是 - 那些尝试过两种方法的人,你更喜欢哪种方法?

tdd ppp pseudocode

16
推荐指数
2
解决办法
2545
查看次数

福勒时态表达的关系模式

Martin Fowler 在这里为定期任务的调度定义了一个优雅的对象模型,它非常好地映射到OO代码.但是,将此映射到关系数据库模式以实现持久性是很棘手的.

任何人都可以建议一个模式+ SQL组合来封装他描述的所有功能,特别是在第11页的图像中.相交和联合是相当明显的 - 复杂性在于表示'时态表达式',它采用可变参数并且必须被解释不同的,然后将它们组合成'时间集'.

需要说明的是,有很多方法可以表示关系数据库中重复事件的概念.我希望大家输入的是如何映射这个特定的模型.

一些可能的选择:

  • 'Meta'表定义参数的数量和使用.丑陋,但可能有效.但是,只有极少数的"时间表达"形式,因此它提供的极大灵活性可能太多了.
  • 某种形式的表继承,由Postgres(以及可能是其他)RBMS支持.

序列化参数列表并将结果存储在varchar()中不是解决方案,因为该方法会阻止基于集合的查询:)

sql orm recurrence scheduling

16
推荐指数
2
解决办法
4872
查看次数

Python中的键盘可中断阻塞队列

它似乎

import Queue

Queue.Queue().get(timeout=10)
Run Code Online (Sandbox Code Playgroud)

是键盘可中断(ctrl-c)而

import Queue

Queue.Queue().get()
Run Code Online (Sandbox Code Playgroud)

不是.我总是可以创建一个循环;

import Queue
q = Queue()

while True:
    try:
        q.get(timeout=1000)
    except Queue.Empty:
        pass
Run Code Online (Sandbox Code Playgroud)

但这似乎是一件奇怪的事情.

那么,是否有一种方法可以无限期地等待但是键盘可以中断Queue.get()?

python concurrency multithreading python-2.x

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

取消接受和关闭Python处理/多处理侦听器连接的正确方法

(我在这个例子中使用了pyprocessing模块,但是如果你运行python 2.6或使用多处理backport,那么用多处理替换处理应该可以工作)

我目前有一个程序,它监听一个unix套接字(使用processing.connection.Listener),接受连接并产生一个处理请求的线程.在某一点上,我想优雅地退出该过程,但由于accept() - 调用是阻塞的,我认为没有办法以一种很好的方式取消它.我有一种方法在这里工作(OS X)至少,设置信号处理程序并从另一个线程发信号通知过程如下:

import processing
from processing.connection import Listener
import threading
import time
import os
import signal
import socket
import errno

# This is actually called by the connection handler.
def closeme():
    time.sleep(1)
    print 'Closing socket...'
    listener.close()
    os.kill(processing.currentProcess().getPid(), signal.SIGPIPE)

oldsig = signal.signal(signal.SIGPIPE, lambda s, f: None)

listener = Listener('/tmp/asdf', 'AF_UNIX')
# This is a thread that handles one already accepted connection, left out for brevity
threading.Thread(target=closeme).start()
print 'Accepting...'
try:
    listener.accept()
except …
Run Code Online (Sandbox Code Playgroud)

python sockets multiprocessing

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