2012-07-18 5 views
1

Je suis la mise en œuvre d'une application Android. J'utilise le service web sur une activité. Je montre une boîte de dialogue de progression jusqu'à ce qu'elle charge la deuxième activité. Mais il ne s'affiche pas pour tout le temps et affiche l'écran noir pendant un certain temps. Il semble que l'application se bloque. Que devrais-je faire? J'ai perdu mes trois jours. J'utilise asynctask pour ces processus. Aidez-moi, s'il vous plaît .Application montrant un écran noir?

protected void onListItemClick(ListView l, View v, final int position, 
     long id) { 
    super.onListItemClick(l, v, position, id); 

    progressDialog = ProgressDialog.show(ProjectListActivity.this, 
      "Please wait...", "Loading..."); 

    new Thread() { 

     public void run() { 

      try { 
       String project = titles.get(position - 1); 

       performBackgroundProcess(project); 

      } catch (Exception e) { 

       Log.e("tag", e.getMessage()); 

      } 

      progressDialog.dismiss(); 
     } 

    }.start(); 

} 



    private void performBackgroundProcess(String project) { 

    String spaceId = null; 
    String spaceName = null; 
    /* 
    * for (Space space : spaces){ 
    * if(space.getName().equalsIgnoreCase((String) ((TextView) 
    * v).getText())){ spaceId = space.getId(); } } 
    */ 
    for (Space space : spaces) { 

     if (project.equals(space.getName())) { 

      newSpace = space; 
     } 

    } 

    spaceId = newSpace.getId(); 
    spaceName = newSpace.getName(); 

    /* 
    * Intent intent = new Intent(this, SpaceComponentsActivity.class); 
    * intent.putExtra("spaceId", spaceId); intent.putExtra("tabId", 0); 
    * intent.putExtra("className", "TicketListActivity"); TabSettings ts = 
    * new TabSettings(); ts.setSelTab(1); this.startActivity(intent); 
    */ 
    Intent intent = new Intent(this, SpaceComponentsActivity.class); 
    intent.putExtra("spaceId", spaceId); 
    intent.putExtra("tabId", 0); 
    intent.putExtra("spaceName", spaceName); 

    // intent.putExtra("className", "TicketListActivity"); 
    TabSettings ts = new TabSettings(); 
    ts.setSelTab(0); 
    ts.setSelTabClass("TicketListActivity"); 
    this.startActivity(intent); 

    /* 
    * Toast.makeText(getApplicationContext(), ((TextView) v).getText(), 
    * Toast.LENGTH_SHORT).show(); 
    */ 
} 
+0

Où est votre code? Aveugle devinez que vous utilisez le fil principal pour appeler 'webService'.use http://developer.android.com/reference/android/os/AsyncTask.html pour appeler' wed service'. –

+0

Je poste mon code. –

+0

J'implémente toute la logique dans la méthode performBackgroundProcess. besoin de poster aussi? –

Répondre

2

pour votre cas, utilisez cette ...

fait progressDialog public à votre Activity

progressDialog = ProgressDialog.show(ProjectListActivity.this, 
     "Please wait...", "Loading..."); 

new Thread() { 

    public void run() { 

     try { 
      String project = titles.get(position - 1); 

      performBackgroundProcess(project); 
      ProjectListActivity.this.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      progressDialog.dismiss(); 

     } 
    }); 

     } catch (Exception e) { 

      Log.e("tag", e.getMessage()); 

     } 


    } 

}.start(); 

mais ce n'est pas une bonne utilisation approch AsyncTask.

+0

Merci M Mohsin monsieur pour votre code mais il montre le même problème que le précédent. J'ai également posté du code pour le processus performbackground. Veuillez suggérer comment la tâche asynctask sera implémentée pour cela. –

+0

qu'est-ce que le processus de prise de temps dans 'performBackgroundProcess()' ?? Je pense que vous venez de lancer une «activité»? Où est 'appel de service Web' pour' AsyncTask' vous devez lire vous-même :) Si vous rencontrez un problème, puis est venu à nouveau demander .. vous êtes le bienvenu .. –

+0

oui je lance l'activité dans le processus de fond. –

1
private class ProgressTask extends AsyncTask<String, Void, Boolean> { 

    private ProgressDialog dialog = new ProgressDialog(HomeActivity.this); 

    protected void onPreExecute() { 
     this.dialog.setMessage("Please wait"); 
     this.dialog.show(); 
    } 

    protected Boolean doInBackground(final String... args) { 
     try { 

      Utilities.arrayRSS = objRSSFeed 
        .FetchRSSFeeds(Constants.Feed_URL); 
      return true; 
     } catch (Exception e) { 
      Log.e("tag", "error", e); 
      return false; 
     } 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 

     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 

     if (success) { 
      // display UI 
      txtTitle.setText(Utilities.RSSTitle); 
     } 
    } 
0

Voici comment je l'ai implémenté. Copier le code ici pour les autres. Espérons que cela fonctionne pour vous aussi. Vous pouvez copier cette fonction "display_splash_screen()" et l'appeler à partir de votre fonction OnCreate() (ou partout où cela est nécessaire).

Mon dialogue (écran de démarrage) R.layout.welcome_splash_screen est affiché, puis dans un fil je ferme la boîte de dialogue après 3 secondes.

`

private void display_splash_screen() { 
    try{ 
     // custom dialog 
     final Dialog dialog = new Dialog(MainActivity.this); 
     dialog.setContentView(R.layout.welcome_splash_screen); 
     dialog.setTitle("Bulk SMS"); 
     dialog.setCancelable(true); 

     dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
      @Override 
      public void onShow(DialogInterface dialogInterface) { 
       Thread thrDialogClose = new Thread(){ 
        @Override 
        public void run() { 
         super.run(); 

         try { 
           // Let the dialog be displayed for 3 secs 
           sleep(3000);   
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 

         dialog.dismiss(); 
        } 
      }; 
      thrDialogClose.start(); 
     }}); 
     dialog.setCanceledOnTouchOutside(true); 
     dialog.show(); 
     }catch (Exception ex){ 
     Log.e("Bulk SMS:", ex.getStackTrace().toString()); 
    } 
} 

`