2016-01-08 6 views
2

Я использовал LeakCanary для тестирования своего приложения. Он показывает утечку, но я не могу это исправить.Активность просочилась, но ее не исправить

public class SplashActivity extends Activity { 

private TextView splashTime; 
private Long showTime; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_splash); 
    init(); 
} 

public void init() { 
    showTime = 1L; 
    splashTime = (TextView) findViewById(R.id.splash_time); 
    splashTime.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      enterApp(); 
     } 
    }); 
    splashTime.setText(getString(R.string.splash_time, showTime)); 
    Log.d("splash", "init"); 
} 

public void enterApp() { 
    Intent intent = new Intent(this, HomeActivity.class); 
    startActivity(intent); 
    finish(); 
}} 

И Канарейки Log нет здесь:

D/LeakCanary: In com.less.haku.hcomic:1.0:1. 
       * com.less.haku.hcomic.SplashActivity has leaked: 
       * GC ROOT static android.app.Instrumentation.mRecommendActivity 
       * references android.app.Instrumentation$RecommendActivity.mTarget 
       * leaks com.less.haku.hcomic.SplashActivity instance 

       * Reference Key: f4ea7ad3-a212-439f-ba67-3557823b07e9 
       * Device: Meizu Meizu m2 note m2 note 
       * Android Version: 5.1 API: 22 
       * Durations: watch=5014ms, gc=176ms, heap dump=2598ms, analysis=23065ms 

Я не имею ни малейшего представления о том, как это произошло, это очень простой, ни одного обработчика, нет внутреннего класса. И я не понимаю canaryLog, как проследить проблему? Спасибо за помощь

Я использовал string.xml для подключения строки. Весь код string.xml здесь:

<resources> 
<string name="app_name">HComic</string> 
<string name="action_settings">Settings</string> 
<string name="splash_time">less %1$ds</string> 
</resources> 

SplashActivity является firstActivity, в очевидном код:

<activity 
     android:screenOrientation="portrait" 
     android:name=".SplashActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

я проверить это во многих случаях, может быть, это вызвано моим телефоном, он не сделал утечка в эмуляторе, я буду тестировать его на некоторых других телефонах Android.

+0

Что происходит при использовании 'GetString (R.string.splash_time)'? –

+0

Проблема здесь: 'splashTime.setText (getString (R.string.splash_time, showTime));' –

+0

показать нам свой код в 'getString (R.string.splash_time, showTime)' –

ответ

0

Это ошибка в Meizu FlymeOS. просто исключите его. подробнее см мой PR

Если вы не можете ждать это PR, чтобы быть объединены, вы можете сделать следующее, чтобы исключить эту утечку:

ExcludedRefs excludedRefs = AndroidExcludedRefs.createAppDefaults() 
      .staticField("android.app.Instrumentation", "mRecommendActivity") 
      .reason("Instrumentation would leak com.android.internal.app.RecommendActivity (in framework.jar) in Meizu FlymeOS") 
      .build(); 
LeakCanary.install(application, DisplayLeakService.class, excludedRefs);