2011-04-28 3 views
2
private Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     removeDialog(0); 
     switch (msg.what) 
     { 
      case SUCCESS: 
       Log.i("LoginActivity", "Got inputstream"); 
       final InputStream is = (InputStream)msg.obj; 
       if (is != null) 
       { 
        //TODO: examine the input stream, etc... 
       } 
       break; 
      case FAILURE: 
       Log.i("LoginActivity", "Login failed"); 
       //TODO: Failure handling 
       break; 
      default: 
       break; 
     } 
    } 
}; 

@Override 
protected Dialog onCreateDialog(int id) 
{ 
    switch (id) 
    { 
     case 0: 
     { 
      dialog = new ProgressDialog(this); 
      dialog.setMessage("Please wait..."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(true); 
      return dialog; 
     } 
    } 
    return null; 
} 

public void loginRequest(String name,String password) 
{ 
    showDialog(0); 
    loginThread thread = new loginThread(serverURL, name, password,getMyIMENumber(), handler); 
    thread.start(); 
} 

...............Android Barre de progression ne se présente pas

public class loginThread extends Thread { 

String name; 
String password; 
InputStream is; 
String Url; 
String ime; 

private final Handler handler; 

    public loginThread(String Url,String name,String password,String ime,final Handler handler) { 
     this.name = name; 
     this.Url = Url; 
     this.password = password; 
     this.ime = ime; 
     this.handler = handler;   
    } 


    public void run() { 
      try{ 
        HttpClient httpClient = new DefaultHttpClient(); 
        String loginURL = Url+"member/login"; 
        HttpPost httppost = new HttpPost(loginURL); 
        HttpParams httpParameters = new BasicHttpParams(); 
        List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
        if(name.contentEquals("")) 
        { 
         pairs.add(new BasicNameValuePair("ime", ime)); 
        } 
        else 
        { 
         pairs.add(new BasicNameValuePair("userName", name)); 
         pairs.add(new BasicNameValuePair("password", password));        
        }     


        int timeoutConnection = 3000; 
        HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
        // Set the default socket timeout (SO_TIMEOUT) 
        // in milliseconds which is the timeout for waiting for data. 
        httppost.setEntity(new UrlEncodedFormEntity(pairs)); 
        HttpResponse response = httpClient.execute(httppost);       
        HttpEntity entity = response.getEntity(); 
        final InputStream is = entity.getContent(); 

        Message message = new Message(); 
        message.obj = is; 
        message.what = server.SUCCESS; 
        handler.sendMessage(message); 
      }catch(Exception e){ 
       Log.e("log_tag", "Error in http connection " + e.toString(), e); 
       handler.sendEmptyMessage(server.FAILURE); 
      }   

    } 

}

boîte de dialogue de progression ne se montre pas ce que je fais i mal ici !! S'il vous plaît aidez-moi ..

......................

// Compilé à partir DexFile.java (version 1.5: 49,0, super bit) public final class dalvik.system.DexFile {

// Méthode descripteur # 8 (Ljava/io/fichier;) V // Stack: 3, les sections locales: 2 DexFile publique (fichier java.io.File) java.ioExceptionIO; 0 aload_0 [ce] 1 invokespecial java.lang.Object() [1] 4 nouvelle java.lang.RuntimeException [2] 7 dup 8 ldc [3] 10 invokespecial java.lang.RuntimeException (java. lang.String) [4] 13 athrow Les numéros de ligne: [pc: 0, ligne: 4] table des variables locales: [pc: 0, PC: 14] locale: cet indice: 0 Type: dalvik.system .DexFile [pc: 0, PC: 14] locale: index de fichiers: 1 Type: java.io.File

// Méthode descripteur # 18 (Ljava/lang/String;) V // Stack: 3 , Locals: 2 public DexFile (java.lang.String fileName) throws java.io.IOException; 0 aload_0 [ce] 1 invokespecial java.lang.Object() [1] 4 nouvelle java.lang.RuntimeException [2] 7 dup 8 ldc [3] 10 invokespecial java.lang.RuntimeException (java. lang.String) [4] 13 athrow Les numéros de ligne: [pc: 0, ligne: 5] table des variables locales: [pc: 0, PC: 14] locale: cet indice: 0 Type: dalvik.system .DexFichier [pc: 0, pc: 14] local: nomFichier index: 1 type: java.lang.String

// Descripteur de méthode n ° 22 (Ljava/lang/String; Ljava/lang/String; I) Ldalvik/system/DexFile; // Pile: 3, sections locales: 3 public static dalvik.system.DexFile loadDex (java.lang.String sourcePathName, java.lang.String nomPathPath, int flags) throws java.io.IOException; 0 nouveau java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException (java.lang.String) [4] 9 athrow Les numéros de ligne: [pc: 0 , ligne: 6] Table de variable locale: [pc: 0, pc: 10] local: sourcePathName index: 0 type: java.lang.String [pc: 0, pc: 10] local: index de sortiePathName: 1 type : java.lang.String [pc: 0, pc: 10] local: indicateurs index: 2 type: int

// Descripteur de méthode # 28() Ljava/lang/String; // Pile: 3, sections locales: 1 public java.lang.String getName(); 0 new java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException (java.lang.String) [4] 9 athrow numéros de ligne: [pc: 0, ligne: 7] table des variables locales: [pc: 0, PC: 10] locale: cet indice: 0 Type: dalvik.system.DexFile

// Descripteur de méthode # 30() V // Pile: 3, sections locales: 1 public void close() throws java.io.IOException; 0 nouveau java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException (java.lang.String) [4] 9 athrow Les numéros de ligne: [pc: 0 , ligne: 8] table des variables locales: [pc: 0, PC: 10] locale: cet indice: 0 Type: dalvik.system.DexFile

// Méthode descripteur # 32 (Ljava/lang/String; Ljava/lang/ClassLoader;) Ljava/lang/Class; // Pile: 3, sections locales: 3 public java.lang.Class loadClass (java.lang.String name, java.lang.ClassLoader loader); 0 nouveau java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException (java.lang.String) [4] 9 athrow Les numéros de ligne: [pc: 0 , ligne: 9] Table de variable locale: [pc: 0, pc: 10] local: cet index: 0 type: dalvik.system.DexFile [pc: 0, pc: 10] local: nom index: 1 type : java.lang.String [pc: 0, pc: 10] local: index du chargeur: 2 type: java.lang.ClassLoader

// Descripteur de méthode # 37() Ljava/util/Enumeration; // Signature:() Ljava/util/Enumeration; // Stack: 3, les sections locales: 1 entrées de java.util.Enumeration publique(); 0 nouveau java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException (java.lang.String) [4] 9 athrow Les numéros de ligne: [pc: 0 , ligne: 10] table des variables locales: [pc: 0, PC: 10] locale: cet indice: 0 Type: dalvik.system.DexFile

// Méthode descripteur # 30() V // Stack : 3, Locals: 1 protected void finalize() throws java.io.IOException; 0 nouveau java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException (java.lang.String) [4] 9 athrow Les numéros de ligne: [pc: 0 , ligne: 11] table des variables locales: [pc: 0, PC: 10] locale: cet indice: 0 Type: dalvik.system.DexFile

// Méthode descripteur # 42 (Ljava/lang/String;) Z booléen natif statique publique isDexOptNeeded (java.lang.String arg0) jette java.io.FileNotFoundException, java.io.IOException; }

+0

pouvez-vous envoyer le code pour la méthode showProgressDialog(). – Umesh

+0

public void showProgressDialog() { \t \t mDialog = ProgressDialog.show (server.this, "", "Veuillez patienter ...", true); \t \t mDialog.setCancelable (false); \t} –

Répondre

2

Vous récupérez le InputStream de votre fil tout de suite, il est plus que probable qu'il est encore nulle, ou a sa valeur initiale, n'a pas eu encore la réponse http. De cette façon, votre boîte de dialogue de progression s'affiche au maximum pendant quelques millisecondes.

Terminez votre loginRequest après avoir appelé thread.start(), et à partir de votre méthode de fil run communiquer si vous avez le résultat ou toute exception vers le thread d'interface utilisateur en utilisant un Handler. Dans handleMessage du gestionnaire de vérifier le résultat du loginRequest (le flux d'entrée de résultat serait préférable d'être transmis au gestionnaire directement, que de le récupérer du thread), et supprimez votre boîte de dialogue de progression.

Mise à jour Voici un exemple comment obtenir ce que vous voulez à l'aide de fils:
Dans le code ci-dessous votre activité principale est référencée comme LoginActivity (puisque je ne connais pas le nom de votre classe), de sorte que vous devrait le changer à quel que soit le nom de la classe d'activité java, où vous avez la méthode loginRequest.

Retirez la méthode showProgressDialog() de votre activité principale, et plutôt mettre:

public static final int FAILURE = 0; 
public static final int SUCCESS = 1; 
private ProgressDialog dialog; 

private Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     removeDialog(0); 
     switch (msg.what) 
     { 
      case SUCCESS: 
       Log.i("LoginActivity", "Got inputstream"); 
       final InputStream is = (InputStream)msg.obj; 
       if (is != null) 
       { 
        //TODO: examine the input stream, etc... 
       } 
       break; 
      case FAILURE: 
       Log.i("LoginActivity", "Login failed"); 
       //TODO: Failure handling 
       break; 
      default: 
       break; 
     } 
    } 
}; 

@Override 
protected Dialog onCreateDialog(int id) 
{ 
    switch (id) 
    { 
     case 0: 
     { 
      dialog = new ProgressDialog(this); 
      dialog.setMessage("Please wait..."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(true); 
      return dialog; 
     } 
    } 
    return null; 
} 

public void loginRequest(String name, String password) 
{ 
    showDialog(0); 
    LoginThread thread = new LoginThread(serverURL, name, password, 
     getMyIMENumber(), handler); 
    thread.start(); 
} 

Notez que la méthode loginRequest a changé!
Alors ce que votre LoginThread classe:

public class LoginThread extends Thread 
{ 

    private final String name; 
    private final String password; 
    private final String url; 
    private final String ime; 
    private final Handler handler; 

    public LoginThread(String Url, String name, String password, 
     String ime, final Handler handler) 
    { 
     this.name = name; 
     this.url = Url; 
     this.password = password; 
     this.ime = ime; 
     this.handler = handler; 
    } 

    public void run() 
    { 
     try 
     { 
      HttpClient httpClient = new DefaultHttpClient(); 
      String loginURL = url + "member/login"; 
      HttpPost httppost = new HttpPost(loginURL); 
      HttpParams httpParameters = new BasicHttpParams(); 
      List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
      if (name.contentEquals("")) 
      { 
       pairs.add(new BasicNameValuePair("ime", ime)); 
      } 
      else 
      { 
       pairs.add(new BasicNameValuePair("userName", name)); 
       pairs.add(new BasicNameValuePair("password", password)); 
      } 

      int timeoutConnection = 3000; 
      HttpConnectionParams.setConnectionTimeout(httpParameters, 
       timeoutConnection); 
      // Set the default socket timeout (SO_TIMEOUT) 
      // in milliseconds which is the timeout for waiting for data. 
      httppost.setEntity(new UrlEncodedFormEntity(pairs)); 
      HttpResponse response = httpClient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      final InputStream is = entity.getContent(); 

      Message message = new Message(); 
      message.obj = is; 
      message.what = LoginActivity.SUCCESS; 
      handler.sendMessage(message); 
     } 
     catch (Exception e) 
     { 
      Log.e("log_tag", "Error in http connection " + e.toString(), e); 
      handler.sendEmptyMessage(LoginActivity.FAILURE); 
     } 
    } 
} 

Maintenant, votre LoginThread instance a un nouveau membre de type Handler. Il est initialisé via un paramètre constructeur (comme les autres), vous pouvez donc le déclarer final.
Ce gestionnaire notifiera votre thread UI (activité principale), s'il a reçu le flux d'entrée de la réponse http, ou s'il a échoué pour une raison quelconque.
Terminez l'implémentation Handler, pour obtenir ce dont vous avez besoin.

J'espère que le code a effacé un peu cette approche.

+0

pouvez-vous m'expliquer s'il vous plaît –

+0

s'il vous plaît voir la mise à jour pour une explication. – rekaszeru

+0

je vous remercie beaucoup, c'est clair pour comprendre, je vais essayer cela ... vous permettra de connaître le résultat. –

3

N'appelez pas thread.run() mais thread.start().

run() appelle la fonction run() sur le même fil de discussion. start() l'appellera dans un nouveau thread. Actuellement, le thread graphique est bloqué car il effectue une action qui doit être effectuée dans le thread d'arrière-plan.

Vous pouvez appeler le fil par:

Thread thread = new Thread(new loginThread(serverURL, name, password,getMyIMENumber())); 
thread.start(); 

Ou faire votre loginThread étendre fil au lieu de la mise en œuvre Runnable.

+0

La méthode start() n'est pas définie pour le type loginThread pour l'obtention de cette erreur –

+0

Voir la réponse modifiée. – MByD

+0

public void start() { \t \t ce.courir(); \t} J'ai ajouté ceci pour faire commencer le travail –

0

à moins que et jusqu'à ce que vous appelez la méthode show de la boîte de dialogue de progression, il n'apparaîtra pas.

do this in your showProgressDialog method -- mDialog.show(); 
+0

ya-je ajouté cela aussi mais il ne se présente pas –

+0

La façon la plus propre à ce genre de opération est en utilisant AsyncTask.Use onPreExecute() pour montrer votre ProgressDialog, doInBackground pour faire vos trucs et onPostExecute pour fermer votre ProgressDialog . --- http://www.brighthub.com/mobile/google-android/articles/82805.aspx – Umesh