我正在开发一款iPhone应用程序,它有一个非常大的UITableView,其中包含从网络上获取的数据,因此我正在尝试优化其创建和使用.
我发现这dequeueReusableCellWithIdentifier非常有用,但是在看到很多使用它的源代码之后,我想知道我对这个函数的用法是不是很好.
这是人们通常做的事情:
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"];
// Add elements to the cell
return cell;
Run Code Online (Sandbox Code Playgroud)
这就是我做的方式:
// The cell row
NSString identifier = [NSString stringWithFormat:@"Cell %d", indexPath.row];
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell != nil)
return cell;
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:identifier];
// Add elements to the cell
return cell;
Run Code Online (Sandbox Code Playgroud)
不同之处在于人们对每个单元使用相同的标识符,因此只出列一个标识符可以避免分配新标识符.
对我来说,排队的重点是给每个单元格一个唯一的标识符,所以当应用程序要求它已经显示的单元格时,既不需要进行分配也不进行元素添加.
很好,我不知道哪个是最好的,"常用"方法将表的内存使用量提升到它显示的确切数量的单元格,而我使用的方法似乎有利于速度,因为它保留所有计算的单元格,但可能导致大内存消耗(除非队列有内部限制).
我这样用它错了吗?或者仅仅取决于开发人员,取决于他的需求?
我有一个奇怪的问题AlphaAnimation.它应该在AsyncTask调用处理程序时重复运行.
但是,第一次调用处理程序时Activity,除非我触摸屏幕或更新UI(例如按下手机的菜单按钮),否则动画将无法启动.
奇怪的是,一旦动画至少运行一次,如果再次调用处理程序,它将毫无问题地启动.
这是代码的样子:
// AsyncTask handler
public void onNetworkEvent()
{
this.runOnUiThread(new Runnable() {
@Override
public void run()
{
flashScreen(Animation.INFINITE);
}
});
}
// Called method
private void flashScreen(int repeatCount)
{
final View flashView = this.findViewById(R.id.mainMenuFlashView);
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
alphaAnimation.setRepeatCount(repeatCount);
alphaAnimation.setRepeatMode(Animation.RESTART);
alphaAnimation.setDuration(300);
alphaAnimation.setInterpolator(new DecelerateInterpolator());
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation)
{
flashView.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation)
{
flashView.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) { }
}); …Run Code Online (Sandbox Code Playgroud) 我正在使用iOS 5 SDK创建一个应用程序.我设法使用Storyboard的Segues推送视图,但我找不到弹出当前视图并返回上一个视图的正确方法.
我没有使用任何navigationController(该应用程序没有任何顶部或底部栏).
我不认为使用modal或push segue是另一种方式,因为它实例化一个新的控制器.
我是否必须使用相反动画的自定义Segue并在最后删除视图?或者,还有更好的方法 ?
我在我的服务器上使用Google Place Details API来存储有关某个地点的信息,使用placeId客户端发送的信息.
我面临着关于结果语言的问题,即使在查询中指定语言时,该地点是城市或该城市的地址也会有所不同.例如:
地方ID ChIJ53USP0nBhkcRjQ50xhPN_zw是米兰市,API返回Milan地点和Lombardy行政区域(英文名称)
地点ID EjBWaWEgZGVsbGEgU3BpZ2EsIE1pbGFuLCBQcm92aW5jZSBvZiBNaWxhbiwgSXRhbHk是米兰的一条街道,API返回Milano为地点和Lombardia行政区域(意大利名称)
为了使它更奇怪,两个搜索都返回Italy到国家.这是API的预期行为吗?
我在a上添加了一个涟漪效果ImageButton,但它被ImageView用作父视图的背景隐藏RelativeLayout.
这是布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="172dp"
android:orientation="vertical"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id="@+id/drawerBackgroundImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/drawer_background"/>
[...]
<ImageButton
android:id="@+id/drawerLogoutButton"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignBottom="@id/drawerEmailTextView"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
style="@style/FlatButtonStyle"
android:scaleType="centerInside"
android:src="@drawable/ic_logout_white_24dp"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
(还有很多其他观点,但它们在这里无关紧要)
我正在使用an ImageView作为背景,RelativeLayout因为我需要scaleType为图像设置一个特定的,所以我不能使用基本android:background属性.
涟漪效果是隐藏的,因为它没有遮罩层(我希望它延伸出按钮的边界),因此使用ImageButton的父视图显示.如果我删除,效果是完全可见的ImageView.
有没有办法让涟漪效果显示在问题之上ImageView?
我想知道是否有任何方法可以在jQuery UI中选择一个月,Datepicker同时仍然可以选择一天.
我试图通过在页面加载后onClick向标题添加一个事件来"黑客"它div,但是切换几个月似乎完全取代了div,从而失去了onClick.
还有其他解决方案吗?或者可能是提供此选项的替代方案?
我目前正在开发一个基本的线程池.我使用了c ++ 11 std::thread,以及std::condition_variable和std::unique_lock.它似乎工作,我现在希望能够杀死一些线程,当太多的线程不活动时.现在,他们的工作是通过给定std::queue的boost::function秒.我想添加一堆空boost::function的,所以线程知道他们必须退出循环.线程的循环是这样的:
void ThreadPool::threadLoop()
{
boost::function<void ()> oThreadTask;
std::unique_lock<std::mutex> oLock(m_oTaskMutex);
while (1)
{
// m_oCV is a static std::condition_variable
// m_oTaskQueue is a static std::queue< boost::function<void ()> >
m_oCV.wait(oLock, [](){ return m_oTaskQueue.size(); });
oThreadTask = m_oTaskQueue.front();
m_oTaskQueue.pop();
m_oTaskMutex.unlock();
if (oThreadTask.empty())
break ;
oThreadTask();
}
// ??
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦我退出循环,我不确定如何正确分离线程.寻找线程的句柄是否干净(我可以访问a std::list<std::thread*>,并且可以比较它们的ID std::this_thread::get_id()),detach()从线程本身调用是否安全,甚至join()?
我正在尝试降低我的应用程序的内存使用量,我注意到它的大部分是由活动的背景引起的:在XHDPI中,720*1280*4 =每个3.6Mbytes,Android似乎没有将它们释放为他们不再使用了.
有没有办法告诉Android加载某些资源图像RGB 565而不是RGB 8888为了在没有alpha通道的情况下在那些较大的图像上保存一些内存?
我知道这可以通过编程方式完成,但我想知道是否也可以使用活动布局中使用的图像和背景来完成setBackgroundResource().
我想在列表的每个现有元素之前插入一个常量元素,即来自:
['foo', 'bar', 'baz']
Run Code Online (Sandbox Code Playgroud)
至:
['a', 'foo', 'a', 'bar', 'a', 'baz']
Run Code Online (Sandbox Code Playgroud)
我尝试过使用列表推导,但我能做到的最好的事情就是使用这个语句的数组数组:
[['a', elt] for elt in stuff]
Run Code Online (Sandbox Code Playgroud)
结果如下:
[['a', 'foo'], ['a', 'bar'], ['a', 'baz']]
Run Code Online (Sandbox Code Playgroud)
所以不完全是我想要的.可以使用列表理解来实现吗?万一重要,我使用的是Python 3.5.
我希望在 MapBox 的 Android SDK 中检测地图运动的完全结束。我所说的完全结束是指不再有用户交互(触摸)和相机移动(触摸移动或快速惯性)。
由于 SDK 中没有此类回调,因此我在 , 上组合了两个侦听器MapView,OnTouchListener如下OnMapChangedListener所示(在 Kotlin 中,但非常清楚):
mapView.setOnTouchListener { _, event ->
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
listener?.onMapDragBegin()
}
MotionEvent.ACTION_UP -> {
listener?.onMapDragEnd()
}
}
false
}
mapView.addOnMapChangedListener { c ->
when (c) {
MapView.REGION_WILL_CHANGE, MapView.REGION_WILL_CHANGE_ANIMATED -> {
listener?.onMapMovementBegin()
}
MapView.REGION_DID_CHANGE, MapView.REGION_DID_CHANGE_ANIMATED -> {
listener?.onMapMovementEnd()
}
}
}
Run Code Online (Sandbox Code Playgroud)
侦听器等待两个事件结束。除了一个微小的细节之外,这种方法工作得很好:当用户停止触摸屏幕时,两个结束事件都会被发送,并且只有在地图REGION_WILL_CHANGE_ANIMATED更改之后才会被调用。所以有时候我不知道地图是否还在移动。在日志中看起来像这样:
19:23:42.431: Map touch started
19:23:42.537: Map region change started
19:23:42.538: Map region change ended
...
19:23:42.570: …Run Code Online (Sandbox Code Playgroud) android ×4
android-ui ×1
c++ ×1
google-maps ×1
image ×1
ios ×1
ios5 ×1
iphone ×1
jquery ×1
jquery-ui ×1
list ×1
localization ×1
mapbox ×1
objective-c ×1
optimization ×1
php ×1
python ×1
python-3.x ×1
rgb ×1
segue ×1
uistoryboard ×1
uitableview ×1