我有一个非常奇怪的问题,我已经简化为以下测试用例:
#include <iostream>
#include <map>
#include <string>
struct Test
{
std::map<std::string, void (Test::*)()> m;
Test()
{
this->m["test1"] = &Test::test1;
this->m["test2"] = &Test::test2;
}
void test1() { }
void test2() { }
void dispatch(std::string s)
{
if (this->m.at(s) == &Test::test1)
{ std::cout << "test1 will be called..." << std::endl; }
else if (this->m.at(s) == &Test::test2)
{ std::cout << "test2 will be called..." << std::endl; }
(this->*this->m.at(s))();
}
};
int main()
{
Test t;
t.dispatch("test1");
t.dispatch("test2");
}
Run Code Online (Sandbox Code Playgroud)
它输出
test1将被调用...
test1将被调用...
当启用优化时,这真的很奇怪.这是怎么回事?
似乎我的问题是MSVC中的一个错误.我正在使用带有Service Pack 1的Visual Studio 2008,我的代码适用于GCC(在codepad.org上测试过).
有关此错误的任何官方信息?任何想法如何解决它?VS2010中是否修复了该错误?所有的见解将不胜感激.
代码:
struct Base {
Base(int i = 0) : i(i) {}
virtual ~Base() {}
virtual Base *clone() const = 0;
protected:
int i;
};
struct A : virtual public Base {
A() {}
virtual A *clone() const = 0;
};
struct B : public A {
B() {}
B *clone() const { return new B(*this); }
/// MSVC debugger shows that 'b' is for some reason missing the Base
/// …Run Code Online (Sandbox Code Playgroud) 我有一个从菜单选项启动的工作首选项设置.在首选项中,我设置了一个自定义首选项,必须启动一个包含3个TextView的对话框来设置确认和更改密码.现在我不知道如何从PreferenceActivity的onPreferenceClick启动对话框.如果我听起来像个新手 - 我很抱歉!
这是对话框弹出窗口的xml布局:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:id="@+id/root"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/TextView_Pwd1"
android:text="@string/settings_oldpassword"
android:textStyle="bold" />
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/EditText_OldPwd" />
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/TextView_Pwd1"
android:text="@string/settings_password"
android:textStyle="bold" />
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/EditText_Pwd1"
android:inputType="textPassword" />
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/TextView_Pwd2"
android:text="@string/settings_password2"
android:textStyle="bold" />
<EditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/EditText_Pwd2"
android:inputType="textPassword" />
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/TextView_PwdProblem"
android:textStyle="bold"
android:gravity="center" />
<TextView
android:id="@+id/TextView_PwdProblem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/settings_pwd_not_equal" />
<CheckBox
android:id="@+id/checkShowPwdText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_showpwd_text" />
Run Code Online (Sandbox Code Playgroud)
这是对话框弹出的DialogChangePassword类:
package biz.linsys.package;
import android.app.Dialog;
import android.content.Context;
import android.content.SharedPreferences; …Run Code Online (Sandbox Code Playgroud) 我想弄清楚Android布局和视图的主要有效性问题.我现在正在做研究,但也许有人已经有了答案.
我有一个RelativeLayout动态填充视图.基本上,应用程序以XML格式加载论坛帖子,然后呈现讨论树,以便每条消息都显示在自己的视图组中.我决定不使用,WebView因为我想实现一些客户端函数,这些函数应该在自定义视图上比在HTML页面上更容易.
然而,这种方法有一个重大缺陷:它很重.
第一个问题(我已经解决了)是嵌套视图.现在这不是问题,我的布局几乎是平的,所以最大深度是10-12(从最顶级的PhoneWindow $ DecorView算起,实际深度取决于数据).
现在我已达到下一个限制,该限制以某种方式与视图的资源消耗相关联(或由其引起).加载数据后,应用程序挂起一段时间来构建布局(创建视图并用数据填充它们),挂起时间似乎与数据大小成线性关系; 如果数据足够大,视图将永远不会出现(最终系统建议关闭应用程序,因为它没有响应).
现在的问题是:
内存消耗是否显着依赖于视图类?换句话说,有没有之间的主要差异Button和TextView,或ImageView?我可以将点击处理程序附加到任何视图,因此它们的使用差别不大.
背景图像会影响性能吗?如果在N视图中设置了相同的图像,它会使布局N时间更重吗?(我知道这个问题可能看起来很傻但无论如何.)
9个补丁图像是否比常规图像重得多?什么是更好的:创建N每个都有一些背景图像的视图,或者使一个视图N更广泛并具有重复背景?
给定一些布局,首先应该优化什么:总视图数,嵌套级别或其他什么?
最有趣的.是否可以衡量或至少估计活动及其观点所消耗的资源?如果我做出一些改变,我怎么能看到我走对了路?
UPDATE
感谢User117,我现在回答了上面提到的一些问题.我已经使用了Hierarchy Viewer并优化了我的布局:与之前相比,现在整体视图数量减少了两倍,嵌套也减少了.
但是,该应用程序仍然挂在一个大型论坛帖子上.
更新2
我已将调试器连接到我的设备,发现应用程序内存不足.
但对我来说非常意外的是,在填充布局后发生错误.顺序如下:
[global] Loaded time zone names for en_US in XXXXms唯一的区别是毫秒数.[dalvikvm-heap] Out of memory on a N-byte allocation实际大小不同).长错误报告开始.这是什么意思?看起来渲染有其可能相当大的要求.
更新3
最后我找到了核心问题.这是我的应用程序的屏幕截图,请参阅图像下方的说明.

每条消息都包含一个显示或隐藏回复的圆形按钮和一个位于按钮右侧的红色内容框.这非常简单,只需要6个视图,包括布局.
问题是这些连接线的缩进显示哪个消息与哪个消息相关.
在我目前的实现中,缩进是由小ImageView的构建的,每个都包含一个方形图像,显示空白区域,垂直线条,T形连接器或L形角.所有这些视图在RelativeLayout包含整个讨论树的大型内部彼此对齐.
这适用于中小型树(最多几百条消息),但是当我尝试加载一棵大树(2K +消息)时,我得到上面更新2中解释的结果.
显然,我在这里有两个问题.我产生大量消耗内存的视图,这些视图 …
我的Qt应用程序有一个大样式表,有很多边距,像素和其他东西直接基于和绘图和图形相关.我很乐意将所有这些内容提供给设计师,但样式表保存在.ui文件中,这对设计人员来说不方便; 她更喜欢看一个单独的文件并使用她常用的工具进行编辑.
我想要的是将样式表移动到外部.qss文件,将该文件添加到程序资源并将其链接到.ui文件,因此样式表将由窗口小部件自动编译和使用,并且应用程序不会保留样式表文件并在运行时加载它.
怎么实现呢?
我遇到了数量字符串(复数)的问题.
手册说,我可以提供特定于每个本地化的数量字符串,并且有几种常见情况:"零","一","两个","很少","很多"和"其他".我不知道是否涵盖了世界上所有语言的所有可能案例; 无论如何,对于俄罗斯来说,我正在尝试进行本地化.
在俄语中,2到4的数字应该被视为"少数"(规则实际上更复杂,但我只需要10以下的数字).
但是,当我请求数量字符串为2时,系统将获取"其他"字符串.它既不是"两个"字符串也不是"少数"字符串(我已经在我的资源中提供了它们).如果我删除了"其他"字符串,我会得到异常:
android.content.res.Resources$NotFoundException:
Plural resource ID #0x7f080000 quantity=2 item=other
Run Code Online (Sandbox Code Playgroud)
我在模拟器(Android 2.1)和真实设备(Android 2.3)上都尝试过这种方法,两种情况下的行为都是一样的错误.显然,某处存在错误 - 系统无法识别我语言的特定于语言环境的数量.这可能是Android有一些错误吗?
首先,我已经阅读了关于活动如何开始,暂停,恢复和停止的重要解释.没关系,但我有另一个问题.
Android参考中的Activity生命周期图表明,如果我调用另一个活动,将为调用活动调用onPause(),稍后当另一个活动结束时,调用者将通过onResume()恢复.
因此,如果第一个活动是Main而另一个是Other,则循环看起来像这样(伪代码):
Main.onCreate()
Main.onStart()
Main.onResume()
// Main is running... Then, the user clicks a button and Other comes in front.
Main.onPause()
Other.onCreate()
// Other's lifecycle goes here... Finally, the user returns back.
Main.onResume()
// Main is running again.
Run Code Online (Sandbox Code Playgroud)
这就是图表所说的.但我的Main首先获取onStart(),然后是onResume().
这是为什么?我误解了什么吗?
我想创建一个动态扩展的布局,可以反映到用户的输入.首先,我创建了一个允许向两个方向滚动的活动布局(这不是我的发明,我使用了评论中解释的另一个问题并进行了一些改进):
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false"
tools:ignore="UselessParent" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false" >
<RelativeLayout
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false" >
</RelativeLayout>
</FrameLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
然后,我在下面创建了一个简单的UI布局,一个文本视图和一个垂直线性布局.这是我的message_with_replies.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/header"
android:layout_width="300dp"
android:layout_height="wrap_content" >
<!-- some text views and buttons here,
I've removed them to keep things simple,
see the screenshot below -->
</LinearLayout>
<LinearLayout
android:id="@+id/replies"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
请注意 …