2016-01-06 3 views
0

У меня серьезные проблемы с моим приложением, так как его утечка памяти. Приложение (услуга) циклируется каждые 30 секунд, загружает данные и помещает их в базу данных. Я использую прослушиватель обратного вызова, который, кажется, является утечкой памяти, не о библиотеке, поскольку я пробовал как залп, так и httpok, я только предполагаю, что это фактически dbhelper. Я полагаю, что я должен использовать weakreference где-то рядом с кодом, я это пробовал, поскольку я реорганизовал сам запрос на другой класс, я также попробовал WeakHashMap, но пока не добился успеха. Я попытался изолировать работоспособный обработчик (я не я использую weakhandler LIB прямо сейчас) еще не идти :( Это крик о помощи, я пишу ту же версию коды в течение 4 дней!HTTP-запрос, вызывающий утечку памяти, или это так?

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 

import com.badoo.mobile.util.WeakHandler; 

import java.io.IOException; 
import java.util.Map; 

import okhttp3.Call; 
import okhttp3.Callback; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 
import prefs.Settings; 
import tools.DBHelper; 

public class tempclass extends Service { 
    private dbhelperFortempclass dbHelper; 
    private WeakHandler mHandler; 
    private Runnable runnable; 
    private OkHttpClient okHttpClient; 

    public tempclass() { 
    } 


    @Override 
    public void onCreate() { 
     super.onCreate(); 

     dbHelper = dbhelperFortempclass.getInstance(); //инциируем sql 
     mHandler = new WeakHandler(); 

     okHttpClient = new OkHttpClient(); 
     executeDownloadsAndWriteToDataBase(); 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
    } 

    public int onStartCommand(Intent intent, int flags, int startId) { 


     return super.onStartCommand(intent, flags, startId); 
    } 

    public IBinder onBind(Intent arg0) { 
     return null; 
    } 


    private void executeDownloadsAndWriteToDataBase() { 

     runnable = new Runnable() { 

      @Override 
      public void run() { 
       try { 
        downloadData(); 
        mHandler.postDelayed(this, 1000); 
       } catch (Exception e) { 
        // TODO: handle exception 
        e.printStackTrace(); 
       } finally { 
        //also call the same runnable 
        mHandler.postDelayed(this, 20000); 
       } 
      } 
     }; 

     mHandler.postDelayed(runnable, 30000); 
    } 

    private void downloadData() throws IOException { 


     for (Map.Entry<String, Settings.ListofCurrencies> entry : Settings.MyCurrencyList.entrySet()) { 
      DownloadAndWriteToDBExecute(entry.getKey()); 

     } 

    } 


    public void DownloadAndWriteToDBExecute(final String whatToGet) { 
     Request request = new Request.Builder().url(whatToGet).build(); 
     Call call = okHttpClient.newCall(request); 
     call.enqueue(new Callback() { 
      @Override 
      public void onFailure(Request request, IOException e) { 
       //logger.log(Level.SEVERE, "Failed to execute " + request, e); 
      } 

      @Override 
      public void onResponse(Response response) throws IOException { 
       if (response.isSuccessful()) { 
        DBHelper.execSQL("sql code"); 
       } else throw new IOException("Unexpected code " + response); 

      } 
     }); 

    } 


} 



import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 


public class dbhelperFortempclass { 

    private static SQLiteDatabase mydb; 
    private static Context myContext; 

    private static dbhelperFortempclass dbHelper = null; 

    protected dbhelperFortempclass() { 
    } 


    public static dbhelperFortempclass getInstance() { 
     if (dbHelper == null) { 
      myContext = MainActivity.getAppContext(); 
      dbHelper = new dbhelperFortempclass(); 
     } 

     return dbHelper; 
    } 


    public static void execSQL(String cmd) { 
     mydb.execSQL(cmd); 
    } 
} 
+0

Почему вы думаете, что есть утечка памяти? – user3707125

+0

Я использовал монитор памяти Android, и приложение получает от 9mb до 100 и сбой) – AndroidFan

ответ

0
private void executeDownloadsAndWriteToDataBase() { 
     runnable = null; //this is what was reason for the memory leak, the runnable was recreating itself 
     runnable = new Runnable() { 

      @Override 
      public void run() { 
       try { 
        downloadData(); 
        mHandler.postDelayed(this, 1000); 
       } catch (Exception e) { 
        // TODO: handle exception 
        e.printStackTrace(); 
       } finally { 
        //also call the same runnable 
        mHandler.postDelayed(this, 20000); 
       } 
      } 
     }; 

     mHandler.postDelayed(runnable, 30000); 
    } 
Смежные вопросы