2013-01-17 9 views
2

Je développe une application simple qui envoie la chaîne pseudo-aléatoire à la base de données du serveur. Ici j'utilise AsyncTask pour envoyer la chaîne au serveur et ProgressDialog au premier plan. Le problème est que la boîte de dialogue de progression ne s'arrête pas et que je ne crée aucune chaîne sur le serveur. Peut-être qu'il y a un problème dans le code d'envoi de srcetring. Je suis nouveau sur Android et j'apprends des sources disponibles sur Internet. Voici le code que j'utilise.ProgressDialog ne s'arrête pas avec AsyncTask

public class MainActivity extends Activity { 

    Button btn; 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView)findViewById(R.id.textView2); 
     btn = (Button)findViewById(R.id.button1); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    public void getThis(View v) { 
     String str = "35" + 
      Build.BOARD.length()%10+ Build.BRAND.length()%10 + 
      Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + 
      Build.DISPLAY.length()%10 + Build.HOST.length()%10 + 
      Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + 
      Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + 
      Build.TAGS.length()%10 + Build.TYPE.length()%10 + 
      Build.USER.length()%10 ; 
     tv.setText(str); 
     UploadUniqueID uni=new UploadUniqueID(this,str); 
     uni.execute(str); 
    } 

    class UploadUniqueID extends AsyncTask<String, Integer, String> { 

     Context context; 
     MainActivity ma; 
     ProgressDialog dialog; 
     String id; 
     public UploadUniqueID(MainActivity activity,String str) { 
      ma = activity; 
      context = activity; 
      dialog = new ProgressDialog(context); 
      id = str; 
     } 

     protected void onPreExecute() { 
      this.dialog.setMessage("Progress start"); 
      this.dialog.setCancelable(true); 
      this.dialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      // perform long running operation operation 
      String id=params[0]; 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://10.0.2.2/UniqueIdApp/myPHP.php"); 

      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
       nameValuePairs.add(new BasicNameValuePair("android",id));  
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       httpclient.execute(httppost);   
      } catch (Exception e) { 
       Log.i("HTTP Failed", e.toString()); 
      }    

      return null; 
     } 

     protected void onProgressUpdate(Integer...integers) { 

     } 

     protected void onPostExecute(String...strings) { 
      tv.setText("Sent"); 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    } 
} 
+0

si vous obtenez une erreur dans le poste logcat ici .. Je –

+0

Non ne reçois aucune erreur .. – apatel

Répondre

0

Vous pouvez également créer et initialiser la boîte de dialogue dans votre UploadUniqueID classe AsyncTask en faisant:

private final ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

et rejeter juste dans votre méthode onPostExecute(...) que vous êtes en train de faire. Ajoutez également l'annotation @Override à votre méthode onPreExecute().

+0

Hey ça a marché .. Mais sa prise presque une minute pour terminer le processus. Quelle pourrait en être la raison? – apatel

+0

@aakash Il effectue une tâche liée au réseau, de sorte que le temps varie en fonction de la quantité de données que vous essayez d'extraire via le service Web. Cependant, c'est normal, ce que vous pouvez faire c'est d'essayer d'optimiser le code du côté PHP et de voir si cela accélère les choses. –

+0

Thanx frère .. Il a beaucoup aidé. – apatel

0

Je vous recommande d'initialiser votre objet ProgressDialog dialog dans la méthode protected void onCreate(Bundle savedInstanceState) et de rejeter la barre de progression dans la méthode onPostExecute(String...strings). Peut être cela vous aidera à remonter le moral :).

Edité

public class MainActivity extends Activity { 
ProgressDialog dialog; 
Button btn; 
TextView tv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv = (TextView)findViewById(R.id.textView2); 
    btn = (Button)findViewById(R.id.button1); 
    dialog = new ProgressDialog(MainActivity.this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public void getThis(View v) { 
    String str = "35" + 
     Build.BOARD.length()%10+ Build.BRAND.length()%10 + 
     Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + 
     Build.DISPLAY.length()%10 + Build.HOST.length()%10 + 
     Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + 
     Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + 
     Build.TAGS.length()%10 + Build.TYPE.length()%10 + 
     Build.USER.length()%10 ; 
    tv.setText(str); 
    UploadUniqueID uni=new UploadUniqueID(this,str); 
    uni.execute(str); 
} 

class UploadUniqueID extends AsyncTask<String, Integer, String> { 

    Context context; 
    MainActivity ma; 
    ProgressDialog dialog; 
    String id; 
    /*public UploadUniqueID(MainActivity activity,String str) { 
     ma = activity; 
     context = activity; 
     dialog = new ProgressDialog(context); 
     id = str; 
    }*/ 

    protected void onPreExecute() { 
     dialog.setMessage("Progress start"); 
     dialog.setCancelable(true); 
     dialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // perform long running operation operation 
     String id=params[0]; 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://10.0.2.2/UniqueIdApp/myPHP.php"); 

     try { 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair("android",id));  
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      httpclient.execute(httppost);   
     } catch (Exception e) { 
      Log.i("HTTP Failed", e.toString()); 
     }    

     return null; 
    } 

    protected void onProgressUpdate(Integer...integers) { 

    } 

    protected void onPostExecute(String...strings) { 
     tv.setText("Sent"); 
     try{ 
    if(dialog!=null && dialog.isShowing()){ 
     dialog.setMessage("DownLoading finished"); 
     dialog.dismiss(); 
    } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
    } 
} 
+0

Je l'ai essayé .. Mais ne fonctionne pas – apatel

+0

Qu'ai tu as essayé ??? Pouvez-vous montrer l'extrait du code que vous avez essayé? – BBdev

+0

J'ai modifié votre code maintenant voir si cela fonctionne ou non? – BBdev

0

Essayez le code ci-dessous:

public class MainActivity extends Activity { 
    Button btn; 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView) findViewById(R.id.textView1); 
     btn = (Button) findViewById(R.id.button1); 
    } 

    public void getThis(View v) { 
     String str = "35" + Build.BOARD.length() % 10 + Build.BRAND.length() 
      % 10 + Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 
      + Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 
      + Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 
      + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 
      + Build.TAGS.length() % 10 + Build.TYPE.length() % 10 
      + Build.USER.length() % 10; 
     tv.setText(str); 
     UploadUniqueID uni = new UploadUniqueID(this, str); 
     uni.execute(str); 
    } 

    class UploadUniqueID extends AsyncTask<String, Integer, String> { 
     Context context; 
     MainActivity ma; 
     ProgressDialog dialog; 
     String id; 

     public UploadUniqueID(MainActivity activity, String str) { 
      ma = activity; 
      context = activity; 
      dialog = new ProgressDialog(activity); 
      id = str; 
     } 

     protected void onPreExecute() { 
      dialog.setMessage("Progress start"); 
      dialog.setCancelable(true); 
      dialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      // perform long running operation operation 
      String id = params[0]; 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(
       "http://10.0.2.2/UniqueIdApp/myPHP.php"); 
      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
        1); 
       nameValuePairs.add(new BasicNameValuePair("android", id)); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       httpclient.execute(httppost); 
      } catch (Exception e) { 
       Log.i("HTTP Failed", e.toString()); 
      } 

      return null; 
     } 

     protected void onProgressUpdate(Integer... integers) { } 

     protected void onPostExecute(String p_result) { 
      super.onPostExecute(p_result);   
      tv.setText("Sent"); 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    } 
} 
+0

Cher que ce soit juste une annotation et ceci est utilisé pour dire Quand nous voulons surcharger une méthode, nous pouvons utiliser cette annotation pour dire au compilateur que nous sommes en train de surcharger une méthode existante. Si le compilateur trouve qu'il n'y a pas de méthode de correspondance trouvée dans super classe, génère un avertissement. Il n'est pas obligatoire d'utiliser @Override lorsque nous remplaçons une méthode. Bien qu'elle ne soit pas obligatoire, elle est considérée comme une meilleure pratique. – BBdev

+0

@BBdev -Oui je sais que ce n'est pas obligatoire mais si vous voulez ignorer la boîte de dialogue de progression, vous devez l'appeler. Sinon, complier ne sera pas capable de le détecter et n'appellera pas le 'dialog.dismiss();'. J'ai trouvé seulement ce problème que son 'onPostExecute' n'a pas été appelé thatz pourquoi j'ai suggéré cette solution. – GrIsHu

+1

Est-ce ??? Si je supprime @Override de la méthode 'oncreate' et que j'exécute mon application, pensez-vous qu'elle ne démarre pas mon application ??? Essayez-le. Il va exécuter votre application comme je le sais. – BBdev

Questions connexes