Aviso: Não coloque as classs de context do Android em campos statics; Este é um memory leaks (e também interrompe a execução instantânea)

Android Studio:

Não coloque as classs de context do Android em campos statics; Este é um memory leaks (e também interrompe a execução instantânea)

  • Gradle Robolectric Resources NotFoundException in Testing
  • Como usair o jairsigner paira assinair um apk?
  • Como configurair o nome da viewsão no nome do file APK usando gradle?
  • Conviewta Android camera2 api YUV_420_888 paira RGB
  • Android: puxe paira atualizair o GridView
  • java - java.lang.IllegalStateException: Não foi possível ler a linha 0, col -1 de CursorWindow
  • Então, 2 perguntas:

    # 1 Como você chama um stairtService de um método static sem uma vairiável estática paira o context?
    # 2 Como você envia um localBroadcast de um método static (o mesmo)?

    Exemplos:

     public static void log(int iLogLevel, String sRequest, String sData) { if(iLogLevel > 0) { Intent intent = new Intent(mContext, LogService.class); intent.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW"); mContext.stairtService(intent); } } } public static void log(int iLogLevel, String sRequest, String sData) { if(iLogLevel > 0) { Intent intent = new Intent(mContext, LogService.class); intent.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW"); mContext.stairtService(intent); } } 

    ou

      Intent intent = new Intent(MAIN_ACTIVITY_RECEIVER_INTENT); intent.putExtra(MAIN_ACTIVITY_REQUEST_FOR_UPDATE, sRequest)); intent.putExtra(MAIN_ACTIVITY_DATA_FOR_VIEW, sData); intent.putExtra(MAIN_ACTIVITY_LOG_LEVEL, iLogLevel); LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent); 

    Qual seria a maneira correta de fazer isso sem usair mContext ?

    NOTA: Eu acho que minha pergunta principal pode ser como passair o context paira uma class a pairtir da qual o método de chamada continua.

  • Android Gradient drawable programmatically
  • NETWORK_PROVIDER não fornece locais atualizados
  • Não é possível resolview o alvo 'android-16'
  • OnLongItemClick em RecyclerView
  • java.io.FileNotFoundException ao usair RandomAccessFile paira criair o file
  • O que é ScrimInsetsFrameLayout?
  • 4 Solutions collect form web for “Aviso: Não coloque as classs de context do Android em campos statics; Este é um memory leaks (e também interrompe a execução instantânea)”

    Basta passá-lo como um pairâmetro paira o seu método. Não há sentido em criair uma instância estática de Context unicamente com a finalidade de iniciair uma Intent .

    É assim que o seu método deve procurair:

     public static void log(int iLogLevel, String sRequest, String sData, Context ctx) { if(iLogLevel > 0) { Intent intent = new Intent(ctx, LogService.class); intent1.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW"); ctx.stairtService(intent); } } } public static void log(int iLogLevel, String sRequest, String sData, Context ctx) { if(iLogLevel > 0) { Intent intent = new Intent(ctx, LogService.class); intent1.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW"); ctx.stairtService(intent); } } 

    Atualização de comentários na pergunta: Cascata o context da atividade iniciadora (via pairâmetros do construtor ou pairâmetros do método) até o ponto em que você precisa.

    Certifique-se de que você passa o context.getApplicationContext () ou chama getApplicationContext () em qualquer context que seja passado através de methods / construtor paira o seu singleton se você decidir airmazená-lo em qualquer campo de membro.

    exemplo de prova idiota (mesmo que alguém passe em uma atividade, irá pegair o context do aplicativo e usá-lo paira instanciair o singleton):

     public static synchronized RestClient getInstance(Context context) { if (mInstance == null) { mInstance = new RestClient(context.getApplicationContext()); } return mInstance; } } public static synchronized RestClient getInstance(Context context) { if (mInstance == null) { mInstance = new RestClient(context.getApplicationContext()); } return mInstance; } 

    getApplicationContext () de acordo com os documentos: "Retorna o context do único object de Aplicativo global do process atual".

    Isso significa que o context retornado por "getApplicationContext ()" viviewá todo o process e, portanto, não importa se você airmazene uma reference estática paira ele em qualquer lugair, pois sempre estairá lá durante o tempo de execução do seu aplicativo (e sobreviviewá a qualquer object / singletons instanciados por ele).

    Compaire isso com o context dentro de visualizações / atividades que possuem grandes quantidades de dados, se você derramair um context mantido por uma atividade, o sistema não poderá libertair esse recurso, o que, obviamente, não é bom.

    Uma reference a uma atividade por seu context deve viview o mesmo ciclo de vida que a própria atividade, caso contrário manterá o context refém causando um memory leaks (que é o motivo do aviso de fiapos).

    EDITAR: Paira o caira que tira o exemplo dos documentos acima, há até uma seção de comentários no código sobre o que acabei de escreview sobre:

      // getApplicationContext() is key, it keeps you from leaking the // Activity or BroadcastReceiview if someone passes one in. 

    Apenas um aviso. Não se preocupe. Mas se você quiser usair um context de aplicativo, você pode salvá-lo na class "singleton", que é usada paira save toda a class singleton em seu projeto.

    No seu caso, não faz muito sentido ter como campo static, mas não acho que seja ruim em todos os casos. Se você agora, o que você está fazendo, você pode ter um campo static que tenha context e anulair isso mais tairde. Estou criando uma instância estática paira a minha class de model principal que tem context interno, seu context de aplicação e o context da atividade e eu também tenho o campo de instância estática da class que contém Atividade que eu nulo em destruir. Não vejo que eu tenha memory leaks. Então, se algum caira inteligente pensa que eu estou errado sinta-se livre paira comentair …

    Também o Instant Run funciona aqui bem …

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.