小编Joh*_* P.的帖子

Android了解堆大小

我是Android开发的新手,我似乎无法掌握Java Out of Memory异常.我知道这意味着我的应用程序已经超过了VM的预算,但经过Google搜索这么多次后,我似乎仍然没有掌握这个概念.我担心我的应用程序会占用太多内存,因为每个屏幕有六个按钮选择器,每个选择器有两个位图,根据属性选项卡每个大约20 kb.在我的根目录G2x上,我已将VM预算设置为12mb,重新启动了我的手机并运行了我的应用程序,没有任何问题.我在每个onDestroy()上取消绑定drawables并暗示GC也在这里运行.在模拟器中使用应用程序一段时间后,在我的DDMS屏幕上单击"原因GC",结果为ID = 1,堆大小6.133 MB,分配2.895MB,自由3.238 MB,%使用47.20,#对象52,623.

这是我不明白发生了什么,我的模拟器设置为24MB的VM.那个数字在哪里?我遇到的实际问题是,如果我将模拟器设置为16MB的VM,我的应用程序会因为内存不足异常而在第二个活动上崩溃.为什么我的手机上的VM设置为12 MB,或者我的旧HTC Magic手机上有12 MB的VM存量?你们还认为我的应用占用了太多内存吗?我不知道这些DDMS号码是否好.谢谢你的时间.

至于我的代码,我有XML布局中指定的每个图像,除了向它们添加侦听器之外,我不会以编程方式对它们执行任何操作.我在这里找到了这段代码,我已将它添加到我拥有的每个活动中......

@Override
protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.myRootLayout));
    System.gc();
}

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}
Run Code Online (Sandbox Code Playgroud)

否则,我所做的就是将onClickListeners添加到具有PNG背景的按钮.我想学习如何以编程方式指定按钮背景,但我需要选择功能,如焦点,按下,非聚焦但按下等,以使按钮背景根据用户交互而变化.我已经回顾了关于这个的文档,但它看起来势不可挡,这就是为什么我认为我从这里开始管理堆的基础知识,并努力在代码中指定选择器.这可能没有意义但是有一个"健康"的内存分配量,应用程序可以分配而不会接近内存不足异常?例如,如果一个应用程序分配6MB应该没问题,但8MB会推动它,在内存分配方面有这样的界限吗?再次感谢Alex Lockwood的回复我将再次阅读并重新阅读,直到这些内容对我有意义

heap android virtual-machine dalvik ddms

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

了解Tensorflow中的while循环

我正在使用TensorflowPython API.我试图在不使用Python循环的情况下实现下面给出的Rosenbrock函数:

Rosenbrock功能

我目前的实施如下:

def rosenbrock(data_tensor):
    columns = tf.unstack(data_tensor)

    summation = 0
    for i in range(1, len(columns) - 1):
        first_term = tf.square(tf.subtract(columns[i + 1], tf.square(columns[i])))
        second_term = tf.square(tf.subtract(columns[i], 1.0))
        summation += tf.add(tf.multiply(100.0, first_term), second_term)

    return summation
Run Code Online (Sandbox Code Playgroud)

我试过在一个实现总结tf.while_loop(); 但是,我发现在使用一个与数据保持独立的索引整数时,API有点不直观.文档中给出的示例使用数据作为索引(反之亦然):

i = tf.constant(0)
c = lambda i: tf.less(i, 10)
b = lambda i: tf.add(i, 1)
r = tf.while_loop(c, b, [i])
Run Code Online (Sandbox Code Playgroud)

python optimization while-loop tensorflow

9
推荐指数
1
解决办法
7595
查看次数

使用 Mongoose 减轻 MongoDB 注入攻击

我正在为 NodeJS使用Mongoose ODM 包装器,但我担心注入攻击。假设我有以下架构:

const UserSchema = new mongoose.Schema({ userName: String, password: String });
Run Code Online (Sandbox Code Playgroud)

如果我要执行如下所示的登录请求:

router.post('/login', (request, response) => {

    const userName = request.body.userName;
    const password = request.body.password;

    User.findOne({ userName: userName }, function (error, user) {
        // ... check password, other logic
    });
});
Run Code Online (Sandbox Code Playgroud)

我会接受以下 JSON 有效负载的注入攻击,它总是会找到一个用户:

{
    "email": { "$gte": "" },
    "password": { "$gte": "" }
}
Run Code Online (Sandbox Code Playgroud)

我不关心密码,因为如果找到阻止任何实际登录的用户,它会被散列,但我想确保我的输入被清理,这样攻击者甚至不会到达那个点。

我知道在类似的StackOverflow 帖子中引用的mongo-sanitize NPM 包似乎删除了所有以“$”开头的 JSON 键。无论如何我都打算使用它,但我永远不会允许用户提交原始的、未解析的 JSON。在这种情况下,假设我做了正确的检查,在 userName 上调用 toString() 是一种好习惯吗?null

const userName = …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb node.js nosql-injection

7
推荐指数
1
解决办法
4886
查看次数

Android Widget随机停止工作

我已经在这个问题上工作了三天了,我已经在这里看了每个问题的答案.我有一个带有按钮的小部件,我希望它只是在每次点击时启动服务.问题是该按钮随机停止工作.我根本无法再创造它,我不知道是什么导致它.我的服务调用stopSelf(); 但是我也遇到了广播接收器这个问题所以我认为问题出在小部件而不是服务中.这是代码

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]     appWidgetIds) 
{

Log.i("Widget", "onUpdate");

final int N = appWidgetIds.length;

    for (int i=0; i<N; i++) 
    {

        int appWidgetId = appWidgetIds[i];

        Log.i("Widget", "onUpdateLoop");


        Intent intent = new Intent(context, ServiceWidgetAction.class);
        intent.setAction(Long.toString(System.currentTimeMillis()));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        PendingIntent pendingIntent = PendingIntent
                .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), 
               R.layout.widget);

        views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);

        views.setTextViewText(
                R.id.widgetTextView,
                "Some text");

        appWidgetManager.updateAppWidget(appWidgetId, views);

    }

}
Run Code Online (Sandbox Code Playgroud)

我一遍又一遍地检查了这段代码,我不知道为什么会这样做.它在3个独立的手机上执行此操作,我无法重新创建它.我已经尝试强制停止应用程序,从任务管理器清除它添加新的小部件等,以使小部件停止工作,它不会.然而,当我今天早上醒来时,小部件不再有效.任何帮助将不胜感激.

android widget broadcastreceiver android-intent android-pendingintent

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

Android动画留下文物

我的项目中有一个相当奇怪的动画问题.在下面发布的屏幕截图中,您可以清楚地看到Totals卡在动画上留下某种痕迹.此问题可在运行4.2.2的库存Nexus 7上重现.Totals卡有一个Google Now风格的动画.重要的是要注意Totals卡的容器是片段,横向屏幕截图中左侧的菜单是不同的片段,底部按钮是片段附加到的活动的一部分.

景观截图

截图

我似乎无法在网上找到解决方案,我已经尝试了setFillAfter"true"并抵消了动画的开头.当按下其中一个按钮时,底部活动按钮("上一个"和"下一个")中的轨迹将消失.

这是Totals Fragment的onCreateView中的代码:

    final View view = inflater.inflate(R.layout.fragment_totals,
            container, false);      

    Fonts.setRobotoThinFont(getActivity(), view);

    final LinearLayout mContainer = (LinearLayout)
            view.findViewById(R.id.container);

    final View mCard = inflater
            .inflate(R.layout.view_simpletotal, mContainer, false);

    Animation animation = AnimationUtils.loadAnimation(getActivity(),
            R.anim.card_animation);

    mContainer.addView(mCard);

    mCard.startAnimation(animation);  

    return view;
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!

animation android visual-artifacts android-fragments

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

片段中的静态数组适配器.好坏练习?

我已经对Java中的静态对象进行了大量的Google搜索,我想我了解它们在Android中是如何工作的.当应用程序的进程终止时,静态对象是GC,而不是当声明静态对象的Activity被销毁时(如果我错了,请纠正我).我有一个使用Tabhost的应用程序,其中包含Fragments.声明对象的Fragment一直到ViewPager的右边(有三个片段).右侧的选项卡有一个显示用户数据的ListView,我希望当用户浏览所有选项卡或导航离开应用程序时,该数据会持续存在.这些数据不需要保存,只需通过正常使用应用程序就可以保留在内存中.给我想要的结果的修复方法是为我的Array Adapter设置一个静态前缀.我的问题是,这被认为是好习惯吗?我知道不正确地使用静态对象会导致内存问题,但是我没有得到任何广泛使用的FC(一遍又一遍地横向画像,快速浏览选项卡,向ListView添加大量数据等).这是我正在使用的代码

static ArrayAdapter<String> arrayAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
{

    View view = inflater.inflate(R.layout.fragment,
            container, false);      

        if (personList == null)
        {

            personList = new ArrayList<String>();

        }


        if (arrayAdapter == null)
        {

            arrayAdapter = new ArrayAdapter<String>
            (getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, personList);

        }
Run Code Online (Sandbox Code Playgroud)

编辑:

这就是我实现这个想法的方式.我在我的主Activity中有这个代码(父对象标签碎片.我把这个代码放在活动的onDestroy()方法中,试着回收一些内存.

@Override
protected void onDestroy() {
    super.onDestroy();

    if (arrayAdapter != null)
    {

        arrayAdapter.clear();

        arrayAdapter = null;

        Log.i("Activity", "Adapter nulled!");

    }


    Log.i("Activity", "Activityhas been destroyed");
}

public ArrayAdapter<String> getArrayAdapter(ArrayList<String> personList)
{

    arrayAdapter = new ArrayAdapter<String>
    (getBaseContext(), …
Run Code Online (Sandbox Code Playgroud)

memory static android fragment android-arrayadapter

4
推荐指数
1
解决办法
5701
查看次数

在调用方法之前使用'this'.

所以我有一个简单的编程问题,我似乎找不到答案.在浏览Google的一些代码时,我注意到他们在代码中将很多方法放在了"this"之前.这样做的目的是什么?没有使用它有什么好处吗?

一个例子:

this.doMethod();
Run Code Online (Sandbox Code Playgroud)

相比:

doMethod();
Run Code Online (Sandbox Code Playgroud)

我确信这是一个简单的答案,我只是想能够理解我读到的所有代码.

java methods

0
推荐指数
1
解决办法
85
查看次数