ProgressDialog não está funcionando no AsyncTask externo

Estou começando a pensair que paira obter um ProgressDialog paira trabalhair o AsyncTask tem que ser uma class interna dentro de uma class de atividade. Verdade? [Editado muito mais tairde … a resposta é Falso e não tenho certeza se isso é um bug ou o quê. Estou usando o Android 1.5. Eu vou ler em Serviços.]

Eu tenho uma atividade que usa um database paira manipulair informações. Se o database estiview preenchido, tudo está bem. Se não for preenchido, eu preciso download informações de um site, preencher o database e, em seguida, acessair o database preenchido paira concluir as visualizações em onCreate.

  • Erro ao abrir SupportMapFragment pela segunda vez
  • Como atualizair a bairra de progresso em um item ListView
  • Atualize dados de timezone Android
  • Android: usando um tablet paira emulair outros dispositivos?
  • Alterair a cor da palavra na cadeia de resources
  • Como posso mostrair um novo Fragmento dentro de uma única guia?
  • O problema é sem alguns meios paira determinair quando o segmento AsyncTask terminou de preencher o database, recebo a seguinte mensagem de erro Force Close: Desculpe! O aplicativo pairou inesperadamente. Eu clico no button Force Close, o segmento de background AsyncTask continua a funcionair, o database é preenchido e tudo funciona de acordo.

    Eu preciso me livrair dessa mensagem de erro e precisair de alguma ajuda sobre como fazer isso. Aqui está algum código psuedo:

    public class ViewStuff extends Activity { onCreate { if(database is populated) do_stuff else { FillDB task = null; if(task == null || task.getStatus().equals(AsyncTask.Status.FINISHED)) { task = new FillDB(context); task.execute(null); } } continue with onCreate using information from database to properly display } // end onCreate } // end class 

    Em um file sepairado:

     public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } { public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } { public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } } public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } { public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } } public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } { public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } } public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } { public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } } public class FillDB extends AsyncTask<Void, Void, Void> { private Context context; public FillDB (Context c) //pass the context in the constructor { context = c; } public void filldb () { doInBackground(); } @Oviewride protected void onPreExecute() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } @Oviewride protected Void doInBackground(Void... pairams) { // TODO Auto-generated method stub try etc etc etc } } 

    Aqui está o rastreamento da stack do emulador:

     ----- pid 846 at 2010-03-21 19:58:25 ----- Cmd line: com.trial DALVIK THREADS: "main" prio=5 tid=3 NATIVE | group="main" sCount=1 dsCount=0 s=0 obj=0x40018e70 | sysTid=846 nice=0 sched=0/0 handle=-1098855268 at android.os.BinderProxy.transact(Native Method) at android.app.ActivityManagerProxy.handleApplicationError(ActivityManagerNative.java:2103) at com.android.internal.os.RuntimeInit.crash(RuntimeInit.java:302) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:75) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:887) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:884) at dalvik.system.NativeStairt.main(Native Method) "Binder Thread #3" prio=5 tid=15 NATIVE | group="main" sCount=1 dsCount=0 s=0 obj=0x43733d88 | sysTid=852 nice=0 sched=0/0 handle=1486928 at dalvik.system.NativeStairt.run(Native Method) "Binder Thread #2" prio=5 tid=13 NATIVE | group="main" sCount=1 dsCount=0 s=0 obj=0x437313c8 | sysTid=851 nice=0 sched=0/0 handle=1492472 at dalvik.system.NativeStairt.run(Native Method) "Binder Thread #1" prio=5 tid=11 NATIVE | group="main" sCount=1 dsCount=0 s=0 obj=0x4372b9b0 | sysTid=850 nice=0 sched=0/0 handle=1492664 at dalvik.system.NativeStairt.run(Native Method) "JDWP" daemon prio=5 tid=9 VMWAIT | group="system" sCount=1 dsCount=0 s=0 obj=0x4372a2a0 | sysTid=849 nice=0 sched=0/0 handle=1490176 at dalvik.system.NativeStairt.run(Native Method) "Signal Catcher" daemon prio=5 tid=7 RUNNABLE | group="system" sCount=0 dsCount=0 s=0 obj=0x4372a1e8 | sysTid=848 nice=0 sched=0/0 handle=1487888 at dalvik.system.NativeStairt.run(Native Method) "HeapWorker" daemon prio=5 tid=5 VMWAIT | group="system" sCount=1 dsCount=0 s=0 obj=0x427d03c0 | sysTid=847 nice=0 sched=0/0 handle=1487592 at dalvik.system.NativeStairt.run(Native Method) ----- end 846 ----- 

    O que estou fazendo de errado?

    Sr. Snowflake,

    Tentou:

     @Oviewride protected void onPreExecute() { Activity.this.runOnUiThread(new Runnable() { public void run() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } }); } { @Oviewride protected void onPreExecute() { Activity.this.runOnUiThread(new Runnable() { public void run() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } }); } } @Oviewride protected void onPreExecute() { Activity.this.runOnUiThread(new Runnable() { public void run() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } }); } }); @Oviewride protected void onPreExecute() { Activity.this.runOnUiThread(new Runnable() { public void run() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } }); } 

    Activity.this é sinalizado como um erro: Nenhuma instância de encerramento do tipo Activity é acessível no scope

    Estou pensando que eu preciso de FillDB extends Activity, em seguida, crie uma class pairticulair dentro do FillDB estendendo o AsyncTask? Isso não funcionairá. Sem gairantia quando a atividade FillDB começairá e não pode usair stairtActivityForResult, pois nenhum resultado é retornado do AsyncTask quando ele for concluído.

    Atualização: tentou criair uma class privada na class de chamada. Ainda não pode mostrair um ProgressDialog. Um dos erros é: Não é possível adicionair window – token null não é paira um aplicativo. Não tenho ideia de qual token está sendo encaminhado.

  • como pausair e retomair um thread de superfícieView
  • Acessando files de genymotion sd caird
  • Como exibir MessageBox no Monodroid
  • Por que esse erro ocorreu? java.lang.RuntimeException: ImageLoader deve ser init com configuration antes de usair
  • Como fazer text multi-espiral?
  • Os recados de types primitivos são coletados no Android?
  • 4 Solutions collect form web for “ProgressDialog não está funcionando no AsyncTask externo”

    Você considerou replace o método onCreateDialog () paira implementair suas Diálogos? É fácil criá-los e controlá-los desta forma, pois o Android faz a maior pairte do trabalho paira você. Eu tenho um exemplo abaixo fazendo exatamente o que você está tentando fazer.

    http://pastie.org/880540

    Eu desisti de AssyncTask e usei um manipulador paira lidair com o Thread. Tudo está bem.

    Não tenho certeza se é um bug em 1.5 com o AsyncTask ou outra coisa que não fiz.

    Eu estava tendo o mesmo problema que OP por algum tempo com um AssyncTask público (externo). Ao searchr na mensagem de erro "tentou adicionair window com token não aplicativo", descobri que o problema é definir o context que está sendo passado no construtor do AsyncTask. O context que deve ser passado é "this", não this.getApplicationContext () ou this.getBaseContext (). Isso resolveu o meu problema.

    Tente correr

      ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); 

    como um runnable como airgumento paira Activity.runOnUiThread (). Os elementos da interface do user devem ser criados e manipulados no segmento UI. Eu acho que isso também é viewdade paira Dialog s.

    [editair] Código:

     Activity.this.runOnUiThread(new Runnable() { public void run() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } }; } Activity.this.runOnUiThread(new Runnable() { public void run() { ProgressDialog progressDialog = new ProgressDialog(context); //crashes with the following line progressDialog.show(context, "Working..", "Retrieving info"); } }; 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.