小编Krø*_*lle的帖子

毕加索:记忆力不足

我有RecyclerView几个图像使用Picasso.在向上和向下滚动一段时间后,应用程序内存不足,并显示如下消息:

E/dalvikvm-heap? Out of memory on a 3053072-byte allocation.
I/dalvikvm? "Picasso-/wp-content/uploads/2013/12/DSC_0972Small.jpg" prio=5 tid=19 RUNNABLE
I/dalvikvm? | group="main" sCount=0 dsCount=0 obj=0x42822a50 self=0x59898998
I/dalvikvm? | sysTid=25347 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1500612752
I/dalvikvm? | state=R schedstat=( 10373925093 843291977 45448 ) utm=880 stm=157 core=3
I/dalvikvm? at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
I/dalvikvm? at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
I/dalvikvm? at com.squareup.picasso.BitmapHunter.decodeStream(BitmapHunter.java:142)
I/dalvikvm? at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:217)
I/dalvikvm? at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
I/dalvikvm? at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
I/dalvikvm? at java.util.concurrent.FutureTask.run(FutureTask.java:234)
I/dalvikvm? at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
I/dalvikvm? at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
I/dalvikvm? at java.lang.Thread.run(Thread.java:841)
I/dalvikvm? at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)
I/dalvikvm? [ 08-10 …
Run Code Online (Sandbox Code Playgroud)

android out-of-memory picasso

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

在FragmentTransaction.replace()后跟后退按钮后,不会重新创建ViewPager片段

我正在尝试实现保存和恢复状态,但是当用Fragmenta 替换main PreferenceFragment然后按下后退按钮时遇到问题.我的主要Fragment包括ViewPager一个FragmentPagerAdapter用3 Fragments来刷卡.点击后退按钮后,没有调用Fragment.onCreateView()我的3 Fragment秒的回调.我已经尝试了所有我在这里遇到的解决方案,但我无法解决这个问题.

另一个可能需要注意的重要事项是,我的3s ViewPager Fragment的数据存储在单独的类中,这些类是实例化的,可以通过Activity.3 Fragments包含RecyclerView用于列出大量数据的s.这样做是为了清洁,但也是为了使这些数据持续存在Activity.这可能不是问题,因为它在启动应用程序时工作正常,但也因为主要问题是我Fragments没有重新创建.

意外行为:

在应用程序创建时,一切正常,但是当我用另一个替换我的main Fragment(包含ViewPagera FragmentPagerAdapter),然后按下后退按钮时,不会重新创建Fragments中的s ViewPager.在onCreateView()我的主要的Fragment 调用.

问题:

我错过了什么?是否还应该创建一些其他回调?我应该在哪里以及如何重建Fragments

我试过了什么:

  1. 改变了FragmentAdapter使用,但我真的应该使用这里getSupportFragmentManager()的解决方案.

编辑:使用错误FragmentManager实际上我的麻烦的来源.请参阅下面的答案.

  1. 添加 @Override public int getItemPosition(Object object) {return POSITION_NONE;}FragmentPagerAdapter,如此处所示. …

android android-lifecycle android-fragments android-viewpager

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

在vba中创建列表字典

我之前在Python工作过,有一个列表字典非常顺利(即一个键对应一个东西列表).我正努力在vba中实现同样的目标.假设我在excel表中有以下数据:

Flanged_connections 6
Flanged_connections 8
Flanged_connections 10
Instrument  Pressure
Instrument  Temperature
Instrument  Bridle
Instrument  Others
Piping  1
Piping  2
Piping  3
Run Code Online (Sandbox Code Playgroud)

现在我想读取数据并将其存储在键所在的字典中Flanged_connections,Instrument并且Piping值是第二列中的相应值.我希望数据看起来像这样:

'key' 'values':

'Flanged_connections' '[6 8 10]'
'Instrument' '["Pressure" "Temperature" "Bridle" "Others"]'
'Piping' '[1 2 3]'
Run Code Online (Sandbox Code Playgroud)

然后通过dict.Item("Piping")将列表[1 2 3]作为结果来获取列表.所以我开始考虑做类似的事情:

For Each row In inputRange.Rows

    If Not equipmentDictionary.Exists(row.Cells(equipmentCol).Text) Then
        equipmentDictionary.Add row.Cells(equipmentCol).Text, <INSERT NEW LIST>
    Else
        equipmentDictionary.Add row.Cells(equipmentCol).Text, <ADD TO EXISTING LIST>
    End If

Next
Run Code Online (Sandbox Code Playgroud)

这似乎有点乏味.有更好的方法吗?我试图寻找在VBA中使用数组,它似乎比Java,C++和Python的有点不同,有stuft喜欢redim preserve和喜欢.这是在vba中使用数组的唯一方法吗?

我的解决方案

基于@varocarbas的评论,我创建了一个集合字典.这是我理解正在发生的事情的最简单方法,尽管它可能不是最有效的.其他解决方案可能也会起作用(未经我测试).这是我建议的解决方案,它提供了正确的输出: …

vba dictionary

15
推荐指数
2
解决办法
3万
查看次数

无论应用状态如何,都可以从通知中正确启动活动

我有一个带有启动画面活动的应用程序,后跟一个主要活动.启动主屏幕之前,启动画面会加载内容(数据库等).通过此主Activity,用户可以导航到多个其他子活动并返回.一些子活动开始使用startActivityForResult(),其他只是startActivity().

活动层次结构如下所示.

|                    Child A (startActivityForResult)
|                   /
|--> Splash --> Main -- Child B (startActivityForResult)
|      ^            \
|      |             Child C (startActivity)
|       \
|        This Activity is currently skipped if a Notification is started
|        while the app is not running or in the background.
Run Code Online (Sandbox Code Playgroud)

单击通知时,我需要实现以下行为:

  1. 必须维护活动中的状态,因为用户已选择一些配方来创建购物清单.如果新的活动开始,我相信州将会丢失.
  2. 如果应用程序位于主活动中,请将其放在前面,并通过我从通知到达的代码告诉我.
  3. 如果应用程序位于子活动开始时startActivityForResult(),我需要在返回主活动之前将数据添加到Intent,以便它可以正确捕获结果.
  4. 如果应用程序在一个子活动开始,startActivity()我只需要返回,因为没有别的事情要做(这当前有效).
  5. 如果应用程序不在后台,也不在前台(即它没有运行),我必须启动主要活动并且还知道我是从通知到达的,这样我就可以设置尚未设置的内容,因为在我的当前设置中,在这种情况下会跳过Splash Activity.

我已经在SO和其他地方尝试过很多不同的建议,但是我无法成功地获得上述行为.我也试过阅读文档而不是变得更加明智,只是一点点.单击我的通知时上述案例的当前情况是:

  1. 我到达了主要活动onNewIntent().如果应用程序未运行(或在后台运行),我不会到达此处.这似乎是预期和期望的行为.
  2. 我无法发现我在任何儿童活动中都来自通知,因此我无法正确地调用setResult()这些活动.我该怎么做?
  3. 这当前有效,因为通知只关闭子Activity,这没关系.
  4. 我可以通过在通知中onCreate() …

notifications android android-intent onactivityresult

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

检查数组的长度是否等于bash中的变量

我想检查bash数组的长度是否等于bash变量(int).我当前的代码如下所示:

if [ "${#selected_columns}" -eq "${number_of_columns}" ]; then
    echo "They are equal!"
fi
Run Code Online (Sandbox Code Playgroud)

这将返回false,因为从不运行echo语句.但是,这样做会产生4:

echo "${#selected_columns[@]}"
echo "${number_of_columns}"
Run Code Online (Sandbox Code Playgroud)

这有什么不对?它与字符串与int有关吗?

bash

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

Android支持库23.4.0:android.support.v7.widget.TintContextWrapper无法强制转换为Activity

所以我更新到最新的支持库,并得到了崩溃,我无法修复.我的build.gradle现在有这些依赖项:

dependencies {
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:gridlayout-v7:23.4.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.android.support:cardview-v7:23.4.0'
    compile 'com.android.support:recyclerview-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    // More stuff...
}
Run Code Online (Sandbox Code Playgroud)

我有一个工作的监听器,用于捕获点击并启动一个新的活动.这在支持库v.23.1.0中工作正常,但在23.4.0(和23.3.0)中没有:

public class IngredientItemOnClickListener implements OnClickListener
{
    private Ingredient mIngredient;

    public IngredientItemOnClickListener(Ingredient ingredient)
    {
        mIngredient= ingredient;
    }

    @Override
    public void onClick(View view)
    {
        MyActivity myActivity = (MyActivity) view.getContext(); // <-- crash here
        myActivity.showIngredientActivity(mIngredient);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个监听器只是附加到一个ImageButton,然后按钮的颜色被着色,如下所示:

Ingredient ingredient = getIngredient();
myImageButton.setOnClickListener(new IngredientItemOnClickListener(ingredient));
Drawable drawable = Tinting.tint(myActivity, R.drawable.my_icon, R.color.red);
myImageButton.setImageDrawable(drawable);
Run Code Online (Sandbox Code Playgroud)

Tinting.tint()我自己的着色功能在哪里:

public class Tinting
{
    @Nullable
    public static Drawable …
Run Code Online (Sandbox Code Playgroud)

android android-support-library

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

iOS:使用ContainerView的动态内容的UIScrollView(一步一步)

虽然这里的问题存在多个问题和答案,但我无法创建UIScrollView静态和动态内容(通过使用a ContainerView)并使大小正常工作.因此,我将提供一步一步的指导,直到我无法取得任何进展,有人可以提供解决方案.通过这种方式,我们将有一个可行的样本,可以一步一步地使其工作.

请注意:为方便起见,所有步骤的输出都上传到https://github.com/oysteinmyrmo/DynamicScrollablePage.可以从那里获取测试Xcode项目并进一步攻击.

更新:在@ agibson007的答案之后,最后有几个步骤可以将原始步骤修复为正常工作的解决方案.通过声明ERROR,查看最终步骤来指出错误.

目标:

有一个UIView带有各种静态UIViews和ContainerView动态内容的长滚动页面.为了完整起见,动态内容将包含一些静态UIViews和一个UITableView将扩展到其全部内容的内容.最后一个因素似乎是我最近偶然发现的各种问题的一个反复出现的主题.

方法:

  1. 我们将从一个新的Xcode项目(Xcode 8.2.1)开始,并使用Swift 3.0.2作为语言.
  2. 我们将一步一步地创建测试UIViews,UIViewControllers和其他所需项目.
  3. 在某些时候,我们有一个"模板",可用于使内容能够由有能力的人动态扩展.

第1步:项目创建

打开Xcode(8.2.1),启动一个新项目.

  1. 选择选项卡式应用程序 我们将UIScrollView在第一个选项卡中创建.
  2. 将产品名称设置为DynamicScrollablePage.
  3. 选择位置并创建项目.

第2步:项目的初始更改

UI的更改将在第一个选项卡中完成.这个过程很大程度上受到这个答案的影响,但我们会ContainerView为动态内容添加几个项目和一个项目.

  1. Main.storyboard,First View(即标签1)删除两个标签.
  2. 单击UIViewController(首先命名).转到它的大小检查,从改变FixedFreeform,改变高度1500这只是故事板视觉变化.
  3. 将剩余的名称重命名UIViewRootView.
  4. 添加UIScrollView内部RootView.说出来ScrollView.约束:
    • ScrollView [顶部,底部,前导,尾随,宽度] = …

uitableview uiscrollview uiview ios

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

如何在包含OpenGL上下文和GL线程的情况下使用GLSurfaceView正确旋转Android设备?

我有一个简单的Android应用程序,使用我们的OpenGL渲染SDK将数据呈现给Android GLSurfaceView.由于我们提供和SDK供其他人使用,我们需要支持GLSurfaceViews的所有用例.目前,我们需要能够在重新创建所有Android视图并保持OpenGL上下文活动的同时旋转设备.这源于客户在横向和横向模式下需要不同的布局.

解决这个问题的正常方法是:

1.添加android:configChanges="orientation|screenSize"到您的活动中AndroidManifest.xml,您将没事.

这将不会在这种情况下,作为工作这不会重新上旋转的意见.因此,通过这样做,我们不能在横向和横向模式中具有不同的布局.

2.呼叫GLSurfaceView.onPause()GLSurfaceView.onResume()Activity.

虽然这被认为是一种很好的做法,但在这个用例中还不够,因为在执行此操作时会破坏OpenGL上下文.请注意,我们仍然这样做,它只是没有解决我们的问题.

3.使用a EGLContextFactory在旋转时保留OpenGL上下文.

这是可能的和有用的,例如在该答案中所描述的.感觉就像一个黑客,但它绝对有效.这个想法只是EGLContext在你没有一个时创建一个并重用你拥有的那个.

使用此hack时遇到的主要问题是渲染线程在GLSurfaceView分离并重新连接到视图层次结构时被销毁并重新创建.这似乎是通过查看GLSurfaceView实现来设计的.

在我们的SDK中,我们有一些线程本地存储连接到线程,所以突然得到一个新的渲染线程是不太可取的.我们可能会在渲染线程发生变化时更改某些状态,但我们想调查是否有更好的方法来执行此操作.

所以我的问题是:

答:使用EGLContextFactory"正确"的方式能够在旋转时手动保存OpenGL上下文吗?

B.有没有办法在旋转时不破坏和重新创建渲染线程(不修改源代码)?

C.在保持OpenGL上下文和渲染线程的同时,是否有更好/更简单的替代方法来实现视图销毁/重建的轮换?

额外信息:

  • 我们总是打电话setPreserveEGLContextOnPause(true);.
  • 渲染本身没有问题,只是所描述的相关问题是有问题的.

android opengl-es glsurfaceview android-thread

6
推荐指数
0
解决办法
859
查看次数

运行时共享首选项是否存储在内存中?

Android 中的共享首选项是否总是在启动时读取并在运行时存储在内存中?如果没有,还有比这更有效的阅读偏好的方法吗?

settings = getSharedPreferences("myPrefsFile", 0);
int answer = settings.getInt("ULTIMATE_QUESTION", 42);
Run Code Online (Sandbox Code Playgroud)

android sharedpreferences

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

从通知意图启动时保持活动状态

我有一个以 Activity 开头的应用程序,用于在显示主 Activity 之前加载内容。启动应用程序通常会执行MyApplication--> MyLoadingActivity--> MyMainActivity。其中MyMainActivity有一个带有 RecyclerViews 和其他东西的 ViewPager。MyMainActivity当导航到应用程序中的其他 Activity 或从其他 Activity 导航时,状态会正确保存和恢复,但从MyMainActivity通知启动时,所有状态都会被清除,因为 Android 会重新启动该 Activity。

通知是通过检查远程服务器更新的服务创建的。一旦发现更新,新数据就会存储在 SQLite 数据库中,并创建有关此的通知。当我单击此通知时,MyMainActicity已启动,但状态丢失。

按照官方指南,以下是我在服务中创建通知的方法:

NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
    .setSmallIcon(R.drawable.foo)
    .setAutoCancel(true)
    .setContentTitle("title")
    .setContentText("text")
    .setStyle(new NotificationCompat.BigTextStyle().bigText("A long text will go here if we are on Lollipop or above."));

Intent notifyIntent = new Intent(context, MyMainActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

PendingIntent notifyPendingIntent = PendingIntent.getActivity(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(notifyPendingIntent);

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); …
Run Code Online (Sandbox Code Playgroud)

android android-intent android-notifications

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