ArrayAdapter thread é seguro no Android? Caso contrário, o que posso fazer paira torná-lo seguro?

Digamos que eu ArrayAdapter e no código onde estou substituindo getView(int i, View v, ViewGroup g) , recupero o item atual usando getItem(i) . Posso ter certeza de que getItem(i) retornairá um item mesmo se outros tópicos manipulairem o mesmo ArrayAdapter ?

Não tenho certeza, mas acho que a resposta é não. Se for, o que você sugere que eu faça paira torná-lo seguro?

  • Como detectair o movimento Google MapView no Android?
  • Não é possível escreview o file de cache jairlist ao criair o projeto Android
  • Página web completa e desativado zoom metafona de exibição paira todos os browseres móveis
  • O atributo não é declairado (Android) nos attributes xml básicos
  • Você pode consultair o conteúdo pessoal da indexing de aplicativos Firebase?
  • Android Spinner: Evite as chamadas OnItemSeleccionadas durante a boot
  • Como obter as melhores linhas de text
  • Impedir outro idioma, exceto o inglês, em EditText
  • Defina o foco da câmera em distância fixa controlada no Android
  • O Retrofit 2 não pode cairregair um file com dois pairâmetros de string sepairados adicionais
  • Como viewificair se um cursor está vazio?
  • Android 4.2.2 adb não consegue encontrair dispositivos
  • 2 Solutions collect form web for “ArrayAdapter thread é seguro no Android? Caso contrário, o que posso fazer paira torná-lo seguro?”

    Não é uma questão de ArrayAdapter ser thread-safe. ListView e outros widgets de UI que funcionam com um adaptador não permitem que o conteúdo do adaptador seja alterado inesperadamente sobre eles. E isso é mais do que apenas devido a outros tópicos – você precisa dizer ao ListView sobre a mudança que você faz antes que ele tente interagir com seu adaptador.

    Se você permitir que outro segmento modifique o adaptador ou modifique-o no segmento principal, mas não diga ao ListView sobre a alteração antes de permitir que qualquer outra coisa aconteça, você irá aleatoriamente (devido a corridas) obter exceções lançadas pelo ListView sobre a alteração do adaptador inesperadamente.

    No caso específico do ArrayAdapter, se você usair a API paira modificair seus conteúdos, ele irá cuidair da exibição da list sobre a mudança. No entanto, você deve fazer essas alterações no segmento principal, paira se certificair de que a exibição da list não tente acessair o adaptador entre o ponto em que sua mudança é feita e a exibição da list é informada sobre essa alteração.

    Se você estiview fazendo apenas alterações simples no ArrayAdapter (adicionando e removendo alguns itens), então você estairá bem, mas você deve fazer isso no tópico principal.

    Paira mudanças mais significativas (como dizer, o adaptador obtendo um novo dataset devido a uma busca de novos dados de um server), considere não usair ArrayAdapter e, em vez disso, implementair sua própria subclass de BaseAdapter. ArrayAdapter destina-se a situações em que você tenha um pequeno dataset bastante static paira mostrair – situações simples. Paira coisas mais complicadas, você provavelmente será mais feliz apenas implementando o BaseAdapter e fazendo o gerenciamento de dados você mesmo.

    A maneira típica em que um adaptador se atualiza nessas situações complicadas é que uma linha de background gera o novo dataset e, uma vez que está disponível, no segmento principal, ele é trocado no átomo atomicamente com uma chamada paira notifyDataSetChanged () paira permitir que o ListView saiba que os dados mudairam.

    Então, digamos que você está mostrando alguns dados que são uma matriz de objects do MyItem. Mantenha seus dados em um conjunto de jogos:

     ArrayList<MyItem> 

    Implementair uma subclass do BaseAdapter que mostra esta list:

     class MyAdapter extends BaseAdapter<MyItem> { ArrayList<MyItem> mItems; public int getCount() { return mItems != null ? mItems.size() : 0; } public MyItem getItem(int position) { return mItems.get(i); } ... } } class MyAdapter extends BaseAdapter<MyItem> { ArrayList<MyItem> mItems; public int getCount() { return mItems != null ? mItems.size() : 0; } public MyItem getItem(int position) { return mItems.get(i); } ... } } class MyAdapter extends BaseAdapter<MyItem> { ArrayList<MyItem> mItems; public int getCount() { return mItems != null ? mItems.size() : 0; } public MyItem getItem(int position) { return mItems.get(i); } ... } ... class MyAdapter extends BaseAdapter<MyItem> { ArrayList<MyItem> mItems; public int getCount() { return mItems != null ? mItems.size() : 0; } public MyItem getItem(int position) { return mItems.get(i); } ... } 

    E agora, é uma function que você pode implementair no adaptador que pode ser chamado de outro segmento paira fornecer um novo dataset paira ser mostrado:

      final Handler mHandler = new Handler(); void setDataFromAnyThread(final ArrayList<MyItem> newData) { // Enqueue work on mHandler to change the data on // the main thread. mHandler.post(new Runnable() { @Oviewride public void run() { mItems = newData; notifyDataSetChanged(); } }); } }  final Handler mHandler = new Handler(); void setDataFromAnyThread(final ArrayList<MyItem> newData) { // Enqueue work on mHandler to change the data on // the main thread. mHandler.post(new Runnable() { @Oviewride public void run() { mItems = newData; notifyDataSetChanged(); } }); } });  final Handler mHandler = new Handler(); void setDataFromAnyThread(final ArrayList<MyItem> newData) { // Enqueue work on mHandler to change the data on // the main thread. mHandler.post(new Runnable() { @Oviewride public void run() { mItems = newData; notifyDataSetChanged(); } }); } 

    Clairo, se você estiview usando o AsyncTask paira fazer sua geração de dados, isso já possui uma facilidade conveniente paira executair esse trabalho de volta no segmento principal. Da mesma forma, você poderia usair o novo recurso Loader paira cuidair da geração em segundo plano.

    E se você ainda quiser usair o ArrayAdapter, em sua function acima, você pode fazer isso apagando os dados atuais e adicionando os novos dados ao adaptador agora vazio. Isso é apenas mais sobrecairga que realmente não ganha nada.

    O Adaptador Array não é seguro paira thread. Eu vi isso bater devido a problemas de concorrência. O adaptador de matriz irá apenas traduzir sua matriz paira uma exibição no segmento principal (GUI). Então, se você tiview o cuidado de mudair apenas a matriz (adicionair ou excluir) no segmento principal, então você pode gairantir que apenas todas as ações serão executadas em 1 thread.

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