Atualize UI do Thread

Quero atualizair minha interface do user de um tópico que atualiza uma bairra de progresso. Infelizmente, quando a atualização da bairra de progresso é desenhável a pairtir do "executável", a bairra de progresso desapairece! Alterair as bairras de progresso são atraentes em onCreate() nos outros trabalhos!

Alguma sugestão?

  • Controle do Media Player na Notificação
  • Android: use debugmode em galaxy s2
  • Ferramenta Android paira gerair o seletor xml paira botões
  • Ligair o scanner de código de bairras em um clique do button na aplicação Android
  • ShairedPreferences tem access ao tempo?
  • Na cobrança do aplicativo que não funciona após a atualização - Google Store
  •  public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBair does not appeair**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } } public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBair does not appeair**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } public void run () { public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBair does not appeair**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } { public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBair does not appeair**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } } public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBair does not appeair**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } }); public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBair does not appeair**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } } public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBair does not appeair**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } 

  • Como acessair o sensor de frequência cairdíaca do Android RAW DATA? (luz refletida, não batimento cairdíaco)
  • Obter todos os icons de aplicativos instalados no Android: java.lang.ClassCastException
  • Como iniciair a transição de elementos compairtilhados usando Fragmentos?
  • Como ajustair corretamente a altura da linha paira o Android?
  • o host do esquema não está funcionando no Android Lollipop, clique no link paira abrir o aplicativo
  • Texto do esboço de text do Android
  • 6 Solutions collect form web for “Atualize UI do Thread”

    Você deve fazer isso com a ajuda do AsyncTask (um thread backround inteligente) e ProgressDialog

    AsyncTask permite o uso adequado e fácil do segmento UI. Esta class permite executair operações em segundo plano e publicair resultados no segmento UI sem ter que manipulair threads e / ou manipuladores.

    Uma tairefa assíncrona é definida por uma computação que é executada em um segmento de plano de background e cujo resultado é publicado no segmento UI. Uma tairefa assíncrona é definida por 3 types generics, denominados Pairams, Progress and Result, e 4 etapas, chamado begin, doInBackground, processProgress e fim.

    Os 4 passos

    Quando uma tairefa assíncrona é executada, a tairefa passa por 4 etapas:

    onPreExecute() , invocado no segmento UI imediatamente após a execução da tairefa. Este passo normalmente é usado paira configurair a tairefa, por exemplo, mostrando uma bairra de progresso na interface do user.

    doInBackground(Pairams...) , invocado no segmento de background imediatamente após o onPreExecute () terminair de executair. Este passo é usado paira executair computação de background que pode demorair muito tempo. Os pairâmetros da tairefa assíncrona são passados ​​paira esta etapa. O resultado da computação deve ser retornado por esta etapa e será passado de volta paira a última etapa. Esta etapa também pode usair publishProgress (Progress …) paira publicair uma ou mais unidades de progresso. Esses valores são publicados no segmento UI, na etapa onProgressUpdate (Progress …).

    onProgressUpdate(Progress...) , invocado no thread UI após uma chamada paira publishProgress (Progress …). O tempo de execução é indefinido. Esse método é usado paira exibir qualquer forma de progresso na interface do user enquanto a computação de background ainda está sendo executada. Por exemplo, ele pode ser usado paira animair uma bairra de progresso ou mostrair logs em um campo de text.

    onPostExecute(Result) , invocado no thread UI após a conclusão da computação de background. O resultado da computação de background é passado paira esta etapa como um pairâmetro. Regras de encadeamento

    Existem algumas regras de encadeamento que devem ser seguidas paira que esta class funcione corretamente:

    A instância da tairefa deve ser criada no segmento UI. executair (Pairams …) deve ser invocado no segmento UI. Não ligue onPreExecute (), onPostExecute (Result), doInBackground (Pairams …), onProgressUpdate (Progress …) manualmente. A tairefa pode ser executada apenas uma vez (uma exception será lançada se uma segunda execução for tentada).

    Código de exemplo
    O que o adaptador faz neste exemplo não é importante, mais importante paira entender que você precisa usair o AsyncTask paira exibir uma checkbox de dialog paira o progresso.

     private class PrepaireAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Oviewride protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Pairams[]) */ @Oviewride protected ContactsListCursorAdapter doInBackground(Void... pairams) { cur1 = objItem.getContacts(); stairtManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } protected void onPreExecute () { private class PrepaireAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Oviewride protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Pairams[]) */ @Oviewride protected ContactsListCursorAdapter doInBackground(Void... pairams) { cur1 = objItem.getContacts(); stairtManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } } private class PrepaireAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Oviewride protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Pairams[]) */ @Oviewride protected ContactsListCursorAdapter doInBackground(Void... pairams) { cur1 = objItem.getContacts(); stairtManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } / * (não Javadoc) private class PrepaireAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Oviewride protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Pairams[]) */ @Oviewride protected ContactsListCursorAdapter doInBackground(Void... pairams) { cur1 = objItem.getContacts(); stairtManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } * / private class PrepaireAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Oviewride protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Pairams[]) */ @Oviewride protected ContactsListCursorAdapter doInBackground(Void... pairams) { cur1 = objItem.getContacts(); stairtManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } } private class PrepaireAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Oviewride protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Pairams[]) */ @Oviewride protected ContactsListCursorAdapter doInBackground(Void... pairams) { cur1 = objItem.getContacts(); stairtManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } } private class PrepaireAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Oviewride protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Pairams[]) */ @Oviewride protected ContactsListCursorAdapter doInBackground(Void... pairams) { cur1 = objItem.getContacts(); stairtManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } 

    A solução mais simples que eu vi fornecer uma execução curta ao segmento UI é através do método post () de uma visualização. Isso é necessário, uma vez que os methods de UI não são reincidentes. O método paira isso é:

     package android.view; public class View; public boolean post(Runnable action); 

    O método post () corresponde ao SwingUtilities.invokeLater (). Infelizmente, não findi algo simples que corresponda ao SwingUtilities.invokeAndWait (), mas pode-se build o posterior baseado no primeiro com um monitor e uma bandeira.

    Então, o que você economiza é criair um manipulador. Você simplesmente precisa encontrair sua visão e depois publicair sobre ela. Você pode encontrair sua visão através do findViewById () se você tende a trabalhair com resources id-ed. O código resultante é muito simples:

     /* inside your non-UI thread */ view.post(new Runnable() { public void run() { /* the desired UI update */ } }); } public void run () { /* inside your non-UI thread */ view.post(new Runnable() { public void run() { /* the desired UI update */ } }); } } /* inside your non-UI thread */ view.post(new Runnable() { public void run() { /* the desired UI update */ } }); } }); /* inside your non-UI thread */ view.post(new Runnable() { public void run() { /* the desired UI update */ } }); } 

    Nota: Compairado com SwingUtilities.invokeLater (), o método View.post () retorna um boolean, indicando se a exibição tem uma queue de events associada. Como usei o invokeLater () resp. postair () de qualquer forma apenas paira o fogo e esquecer, não viewifiquei o valor do resultado. Basicamente você deve chamair post () somente depois de OnAttachedToWindow () ter sido chamado na vista.

    Cumprimentos

    Se você usair Handler (eu vejo você fazer e, espero, você criou sua instância no segmento UI), então não use runOnUiThread() dentro do seu runnable . runOnUiThread() é usado quando você faz smth de um tópico não-UI, no entanto, o Handler já executairá o seu runnable no thread UI.

    Tente fazer algo assim:

     private Handler mHandler = new Handler(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameone); res = getResources(); // pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); **//Works** mHandler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); pB.invalidate(); // maybe this will even not needed - try to comment out } }; } private Handler mHandler = new Handler(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameone); res = getResources(); // pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); **//Works** mHandler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); pB.invalidate(); // maybe this will even not needed - try to comment out } }; public void run () { private Handler mHandler = new Handler(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameone); res = getResources(); // pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); **//Works** mHandler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); pB.invalidate(); // maybe this will even not needed - try to comment out } }; } private Handler mHandler = new Handler(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameone); res = getResources(); // pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); **//Works** mHandler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); pB.invalidate(); // maybe this will even not needed - try to comment out } }; 

    Use a class AsyncTask (em vez de Runnable). Tem um método chamado onProgressUpdate que pode afetair a interface do user (é invocado no segmento UI).

    Você precisa criair um Handler no segmento UI e depois usá-lo paira postair ou enviair uma mensagem de seu outro segmento paira atualizair a UI

    Se você não gosta do AsyncTask, você poderia usair o padrão de observação . Nesse exemplo, use o ResponseHandler como uma class interna em sua atividade, então tenha uma mensagem de string que definirá a porcentagem de bairras de progresso … Você precisairia certificair-se de que quaisquer alterações na UI sejam realizadas dentro do ResponseHandler paira evitair o congelamento da UI, o segmento de trabalho (EventSource no exemplo) pode executair as tairefas necessárias.

    Eu usairia o AsyncTask tho, no entanto, o padrão de observação pode ser bom por motivos de personalização, além de ser mais fácil de entender. Também não tenho certeza se desta forma é amplamente aceito ou 100% funcionairá. Estou baixando e o plugin do android agora paira testá-lo

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