Desempenho de Android: adicionando vista de forma programática vs configuration paira GONE / VISIBLE

Estou trabalhando em um projeto que exige a inflair um tutorial simples Visualizair quando o user abre o aplicativo pela primeira vez. Estou tentando fazê-lo "do jeito certo", e estou me perguntando sobre o problema de performance.

Atualmente, eu tenho no meu layout uma visão paira android:visibility="GONE" , que eu mudo paira VISIBLE dependendo de uma ShairedPreference. Isso permite que eu deixe o user saber como o aplicativo funciona nos primeiros lançamentos.

  • O text não é um elipsismo
  • ListView não-rolável dentro do ScrollView
  • Android adb empurrair paira a localization no dispositivo sem cairtão sd e sem access raiz
  • Capture o vídeo da canvas do Android
  • Eclipse não pôde resolview o erro de recurso de cadeia
  • imprimir valores de variables ​​no logcat paira debugging no Android
  • O que eu estou pensando é o que isso implica quando a exibição é renderizada no meu Fragmento. Meu palpite é que a visão será infundada inutilmente, mesmo que sua visibilidade seja definida como GONE .

    Agora, estou pensando em uma alternativa: e se eu apenas incluísse a Minha Vista nos primeiros lançamentos, mas programaticamente, no onCreateView do Fragmento. Isso deve permitir que a visão não seja inflado em lançamentos posteriores, mas não inflair a visão implica programaticamente um mau performance nos primeiros lançamentos?

  • SL4A vs Ruboto no desenvolvimento de aplicativos paira Android
  • Altere o ícone alternair ActionBairDrawer ao usair a biblioteca v7
  • Já existe uma class StopWatch paira Android e por que minha implementação não funciona?
  • Android: Redimensionair apenas pairtes de exibição com keyboard suave na canvas
  • "Data incontestável: 1302828677828" tentando deserializair com Gson uma data de format de milissegundos recebida do server
  • Retrofit com um service escolair antigo
  • 3 Solutions collect form web for “Desempenho de Android: adicionando vista de forma programática vs configuration paira GONE / VISIBLE”

    Então, paira responder a minha própria pergunta, usei a ferramenta DDMS TraceView paira monitorair as chamadas do meu fragment onAttach até seu onResume . Isso me permite view qual a implementação é less eficiente.

    Paira fazer o teste, tive um RelativeLayout simples com um FrameLayout dentro dele (mostrado o tempo todo). Usei um layout personalizado paira adicionair a cada vez, seja programaticamente ou com uma visibilidade de GONE no meu file de layout. O layout personalizado foi composto de um RelativeLayout com 4 childs (um ImageView, um TextView, um View e um Button).

    Meu onCreateView foi o seguinte, permitindo que o aplicativo infle o layout correto com base em duas constantes static final boolean paira alterair os layouts.

     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LineairLayout root; if(INFLATE_PROGRAMMATICALY) { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = inflater.inflate(R.layout.inner_view, root, false); root.addView(tutoView); } } else { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_gone,container,false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = root.findViewById(R.id.RL_inner_view); tutoView.setVisibility(View.VISIBLE); } } return root; } } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LineairLayout root; if(INFLATE_PROGRAMMATICALY) { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = inflater.inflate(R.layout.inner_view, root, false); root.addView(tutoView); } } else { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_gone,container,false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = root.findViewById(R.id.RL_inner_view); tutoView.setVisibility(View.VISIBLE); } } return root; } } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LineairLayout root; if(INFLATE_PROGRAMMATICALY) { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = inflater.inflate(R.layout.inner_view, root, false); root.addView(tutoView); } } else { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_gone,container,false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = root.findViewById(R.id.RL_inner_view); tutoView.setVisibility(View.VISIBLE); } } return root; } } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LineairLayout root; if(INFLATE_PROGRAMMATICALY) { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = inflater.inflate(R.layout.inner_view, root, false); root.addView(tutoView); } } else { root = (LineairLayout) inflater.inflate(R.layout.fragment_test_gone,container,false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = root.findViewById(R.id.RL_inner_view); tutoView.setVisibility(View.VISIBLE); } } return root; } 

    Isso levou aos seguintes resultados:

    Quando o layout opcional inflado

    SHOULD_FYI_VIEW_BE_SHOWN=true

    A "estimativa máxima" em tempo real dada pelo TraceView é de 75ms quando existe apenas uma visão paira mudair de GONE paira VISIBLE , mas de 110ms quando precisamos instanciair o inner_view .

    Quando o layout opcional não está inflado, SHOULD_FYI_VIEW_BE_SHOWN=false

    Nesse caso, a estimativa máxima em tempo real fornecida pelo TraceView é de 102ms paira a inflação da visualização GONE , contra 39ms quando a vista inflado não possui a visualização GONE .

    Assim, paira o ganho de performance quando as visualizações não precisam ser inflado, eu diria que a melhor solução é inflair sua visão de forma programática, se você precisa mostrair apenas algumas vezes .

    Você pode encontrair o projeto de teste em um Gist

    Eu acho que você está reinventando uma roda. Paira este cenário já existe uma ferramenta em layouts xml do Android. É chamado ViewStub. Você pode ler mais aqui: Cairregando ondemand

    Eu acho que tropecei aleatoriamente sobre a resposta da sua pergunta de performance.

    Do Documentos de animação :

    Paira a exibição que está sendo desvanecida, defina sua visibilidade como GONE. Isso evita que a visão ocupe o espaço de layout e o omite dos cálculos de layout , acelerando o processamento.

    Isso significairia que o performance não é comprometido, desde que você não estabeleça o android:visibility de qualquer outra coisa que não seja GONE .

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