小编GPa*_*ack的帖子

图像适配器泄漏内存

我有一个简单的ListActivity,显示图像和我inizialize我OkHttpClient毕加索生成器在ImageAdapter类的构造函数:

picassoClient = new OkHttpClient();
picassoClient.interceptors().add(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request newRequest = chain
            .request()
            .newBuilder()
            .addHeader("Cookie","xyz")
            .build();

        return chain.proceed(newRequest);
    }
});

new Picasso.Builder(context).downloader(new OkHttpDownloader(picassoClient)).build();
Run Code Online (Sandbox Code Playgroud)

然后在getView()我使用Picasso在ImageView中加载图像:

Picasso.with(context).load(xyzUrl).fit().centerCrop().into(vImage);
Run Code Online (Sandbox Code Playgroud)

它运行良好,但在设备的旋转中,我看到堆大小有时会慢慢增长,有时很快,有时会保持稳定.它很少掉落.我是在泄漏内存还是在代码中出现了问题?

编辑: 我在Picasso的电话中插入了这段代码getView()

if (BuildConfig.DEBUG) {
    Log.i("HEAP SIZE",
    String.valueOf((Runtime.getRuntime().totalMemory() / 1024)
    - (Runtime.getRuntime().freeMemory() / 1024)));
}
Run Code Online (Sandbox Code Playgroud)

我发现堆大小的增长发生在getView()后加载位图到ImageView中.怎么了?

编辑2:尝试设置静态ImageAdapter,没有任何变化

编辑3: 尝试使用RecyclerView而不是ListView,行为相同:堆大小不断增长,同时滚动图像列表每次步进30-40个字节onBindViewHolder().设备的旋转堆大小有时会增加甚至2-3兆字节.很少下降.

为什么堆大小缓慢但持续增长?为什么我在设备轮换后泄漏一些缓存或一些缓存的位图?

更新: 尝试了没有构造函数中的代码的适配器(没有new OkHttpClientnew Picasso.Builder),它工作,堆大小现在保持稳定.那么,使用cookie头管理初始化客户端的正确方法是什么? …

android listadapter picasso okhttp android-recyclerview

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

缺少API级别25的Google API

在Android SDK Manager中,我无法找到API级别为25的Google API.因此,我无法将compileSdkVersion设置为"Google Inc.:Google API:25".我在我的应用程序中使用MapActivity,并且由于不兼容的sdk版本,com.google.android不受支持.有没有其他方法可以在没有Google API的情况下使用它?

android google-maps google-api android-studio android-developer-api

18
推荐指数
1
解决办法
2131
查看次数

ActionBar中动画ActionBarDrawerToggle的颜色

如何使用AppCompat-v7(v21)更改ActionBar中动画ActionBarDrawerToggle图标的颜色?我尝试过这个,但是没有用.谢谢.

myActionBarActivity.java

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mLeftDrawer = (LinearLayout) findViewById(R.id.left_drawer);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.string.drawer_open, R.string.drawer_close)
Run Code Online (Sandbox Code Playgroud)

价值观/ styles.xml

    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
Run Code Online (Sandbox Code Playgroud)
    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/black</item>
    </style>
Run Code Online (Sandbox Code Playgroud)

更新:解决了,<item name="actionBarWidgetTheme">我的主题中有这个条目可能重叠 <item name="drawerArrowStyle">.我删除了它,现在一切正常.

android-appcompat android-5.0-lollipop

16
推荐指数
3
解决办法
7129
查看次数

有多少WindowInsets?

我不了解WindowInsets rects,因为docs说:

系统窗口插图表示全屏窗口的区域,该区域被状态栏,导航栏,IME或其他系统窗口部分或完全遮盖.

因此,多个WindowInsets可以在每个都有自己的rect(一个用于状态栏,另一个用于导航栏......),我该如何检索它们?

或者是有只有一个WindowInsets和它的左顶右底坐标是该应用的可用窗口的矩形?

android android-view android-windowmanager

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

使用firebase-messaging错过了GoogleApiAvailability:9.4.0

将依赖关系声明为

compile 'com.google.firebase:firebase-messaging:9.4.0'
Run Code Online (Sandbox Code Playgroud)

我在活动的导入行中收到"无法解析符号GoogleApiAvailability"消息

import com.google.android.gms.common.GoogleApiAvailability;
Run Code Online (Sandbox Code Playgroud)

怎么了?

  • 没问题的重复:Google Play服务已经是最新版本

android firebase firebase-cloud-messaging

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

打盹模式和前台服务

检查我的应用程序的M预览版设备上的行为,似乎它的前景(有活动通知)服务播放音乐不会影响打盹模式.但是阅读文档似乎只能从AppStandby中免除前台服务.

什么是真正的规则?

android android-mediaplayer android-6.0-marshmallow

15
推荐指数
1
解决办法
7567
查看次数

禁用工具栏滚动

我有当前的设置:

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordiator_layout_in_main"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways"/>
</android.support.design.widget.AppBarLayout>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.design.widget.NavigationView
        android:layout_width="170dp"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"/>

    <FrameLayout
        // I place a fragment containing a viewpager containing    fragments that contain a recyclerview.... 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toRightOf="@+id/nav_view">

    </FrameLayout>
</RelativeLayout>

<FrameLayout
    android:id="@+id/settings_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="invisible">
</FrameLayout>

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_refresh"
    app:layout_anchor="@id/coordiator_layout_in_main"
    app:layout_anchorGravity="bottom|right|end"   
   app:layout_behavior="com.material.widget.MyFloatingActionButtonBehavior" />

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

现在一切都按预期工作,如果我在包含片段的framelayout内滚动,工具栏可以根据需要滑入和滑出

现在重点是,如果我滚动位于framelayout侧面的NavView(以及relativelayout内部),我想禁用工具栏滑入和滑出

但无论我是否删除所有滚动行为,工具栏都会继续滑入和滑出(只有禁用它的方法是从appbarlayout中移除滚动标记,但禁止所有滑入和滑出tolbar)

请问我在这里错过了什么?是不是应该将滚动事件传递给CoordinatorLayout的scolling行为?

android android-design-library androiddesignsupport android-coordinatorlayout android-appbarlayout

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

AppBarLayout.ScrollingViewBehavior的数学如何运作?

offsetChildAsNeeded在运行滚动更改时,我会在AppBarLayout.ScrollingViewBehavior中观察该方法的数学流程.

由于它是私有方法和私有方法mOffsetDelta,如何以编程方式监视它们?

(目前尚不清楚该方法是如何使用的offset.)

private void offsetChildAsNeeded(CoordinatorLayout parent, View child, View dependency) {
    final CoordinatorLayout.Behavior behavior =
                ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior();
    if (behavior instanceof Behavior) {
        // Offset the child, pinning it to the bottom the header-dependency, maintaining
        // any vertical gap, and overlap
        final Behavior ablBehavior = (Behavior) behavior;
        final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling();
        ViewCompat.offsetTopAndBottom(child, (dependency.getBottom() - child.getTop())
                + ablBehavior.mOffsetDelta
                + getVerticalLayoutGap()
                - getOverlapPixelsForOffset(dependency));
        }
    }
Run Code Online (Sandbox Code Playgroud)

注意:欢迎,也可以接受回复那些解释数学的逻辑getTopBottomOffsetForScrollingSibling(),和(dependency.getBottom() - child.getTop()),和内容的细节mOffsetDelta

android android-coordinatorlayout android-appbarlayout

14
推荐指数
1
解决办法
597
查看次数

Activity的成员范围和Asynctask

我在Activity类中初始化一个成员变量

private String test = new String("A");
Run Code Online (Sandbox Code Playgroud)

然后我用它来编写一个长时间消耗循环的doInBackground()方法,从Activity中启动一个匿名的AsyncTask

new AsyncTask<Void, Void, Void>() {
   @Override
   protected void onPreExecute() {
   }

   @Override
   protected void onPostExecute(Void result) {
   }

   @Override
   protected Void doInBackground(Void... params) {

     for (int j = 10; j >= 0; j--) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.i("DOINBACKGROUND ", test);
     }

}.execute(); 
Run Code Online (Sandbox Code Playgroud)

:当我离开,而活动Asynctask仍在执行,而活动的后onDestroy()执行,我在日志中看到的成员变量仍然活着,并且不被破坏.有人可以向我解释这有可能吗?

BOUNTY QUESTION:成员变量仍然存在,因为即使之后onDestroy(),由于gc标准和gc优先级,它还没有被使用.还行吧.

但我怀疑是否

  • 'test'成员变量(以及活动的上下文)在引用asynctask结束它的东西之前不会被攻击,因此asynctask可以完整地完成它doInBackground()而不会崩溃(尽管有临时内存消耗)

或者相反

  • 无论asynctask正在运行,'test'成员变量迟早会被包围,可能会导致asysnctask的崩溃

java android scope android-asynctask android-activity

13
推荐指数
1
解决办法
595
查看次数

TabLayout选择了标签重力

TabLayout设置有ViewPager,有很多标签MODE_SCROLLABLE和keyline app:tabContentStart="72dp".

当用户选择选项卡时,TabLayout尝试将所选选项卡滚动到中心.我希望选中的选项卡与keyline保持对齐,而不是居中.可能吗?

Android设计支持库v22.2.0.

android android-design-library androiddesignsupport android-tablayout

13
推荐指数
2
解决办法
2564
查看次数