Android工作室内存泄漏活动未在一个线程中完成

时间:2017-03-17 09:16:55

标签: android multithreading android-activity memory-leaks

似乎我的活动没有正确完成,因为每次启动和关闭它时我都会获得更大的内存消耗。有人可以建议我一个想法吗?这是代码:

declare
  v_qry varchar2(4000) := '';
  v_res number;
begin
  for x in (
    select table_name, column_name, data_type, data_length 
      from user_tab_columns 
     where data_type in ('VARCHAR2', 'CHAR', 'NVARCHAR2') 
   order by data_type
  ) loop
     -- prepare your statement
     v_qry := 'select  MAX(LENGTH('||x.column_name||')) FROM '||x.table_name||' ';
     -- execute
     execute immediate v_qry into v_res;
     -- print result
    dbms_output.put_line('in:'||x.table_name||'.' ||x.column_name||':'||v_res||':compared to:'|| x.data_length);
  end loop;
end;
/

2 个答案:

答案 0 :(得分:0)

Android Studio首先有一个built in support in finding a memory leak。另一种选择是使用Leak Canary。现在,在您的代码中,我看到:mLocationManager。我怀疑这会导致泄漏。您可以使用我之前提到的方法对其进行验证。当你对它进行限定时,不要传递活动上下文 - 使用mActivity.getApplicationContext()

答案 1 :(得分:0)

您的ProgressDialog永远不会被取消的条件很少,例如

 while (mLastLocation == null)
        {
            if(SystemClock.currentThreadTimeMillis() - startTime >= 5000){
                mLastLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
            if(SystemClock.currentThreadTimeMillis() - time >= 1000) {
                if (ActivityCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                mLocationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mLocationListener, null);
                time = SystemClock.currentThreadTimeMillis();
            }
        }

您的线程永远不会完成,但它会保留您的活动的参考(例如在ProgressDialog中)。我建议你重构你的代码。例如,您可以在onStop()方法中取消()ProgressDialog。