2011-09-02 1 views
0

J'écris un programme générateur de nombres aléatoires pour afficher la sortie toutes les secondes. L'aperçu est que chaque seconde, lorsque le nombre aléatoire change, je voudrais que le nombre aléatoire soit sorti dans la boîte 'EditText'. C'est possible?Utilisation de 'tâches asynchrones' sur Android pour générer un nombre et une sortie aléatoires

J'ai des recherches sur le sujet, mais cela échoue (principalement à cause du fonctionnement de l'async).

Voici le code que je l'ai écrit:

package com.example; 

import java.util.Random; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class AsyncTasksActivity extends Activity { 

EditText txtMessage; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   

    String ranString = ""; 

    try{ 
     ranString = ""; 
     for(int a = 0; a < 33; a++) 
     { 
     Random rn = new Random(); 
     int i = rn.nextInt(256); 

     ranString = ranString + i + " "; 

     } 
    } catch (Exception e) { 
     System.err.println("Error: " + e.getMessage()); 
    } 
    txtMessage = (EditText) findViewById(R.id.txtMessage); 
    txtMessage.setText(ranString); 
} 

public class runRandomly extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 

    } 


} 

Dans le cas où vous devez exécuter le code pour assurer qu'il fonctionne, j'ai lieu le code xml ici:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:weightSum="1"> 

<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="Null" 
/> 
<EditText 
android:id="@+id/Null" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:singleLine="true" 
android:inputType="numberDecimal"/> 

<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"   
android:text="Random Key"/> 
<EditText 
android:id="@+id/txtMessage" 
android:layout_width="fill_parent" 
android:gravity="center" 
android:editable="false" android:layout_height="61dp" android:layout_weight="0.14"/> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 
</LinearLayout> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"/> 

</LinearLayout> 

Much Merci !

+0

Vous êtes très proche. Juste faire une estimation rapide. Je suis sûr que vous pouvez trouver une meilleure réponse partielle vous-même. Quel code aurait du sens dans doInBackground?Et quel code aurait du sens à l'intérieur de onProgressUpdate? Si vous n'êtes pas à l'aise avec l'écriture d'un code réel, écrivez simplement un pseudo-code de type "commment-out" dans ces deux méthodes. Nous pouvons vous aider à faire le reste. –

+0

doInBackground - signifie que le nombre aléatoire qui s'exécute de manière continue alors que progressUpdate est celui qui envoie la mise à jour à l'interface utilisateur? – Ezylryb

+0

@Ezylryb: regarde ma réponse éditée, utilise ce code. – user370305

Répondre

0

De mon point de vue,

  1. Faire un constructeur de votre signature d'activité de passage de classe AsyncTask, comme,

    public runRandomly(Activity activity) { 
    this.activity = activity; 
    context = activity; 
    } 
    
  2. surchargeons aussi cette méthode

    @Override 
    protected void onProgressUpdate(Integer... values) 
    { 
    
    super.onProgressUpdate(values); 
    if (values[0] == 0) { 
    mDialog.setTitle("Processing..."); 
    } 
    
    mDialog.setProgress(values[0]); 
    
    } 
    
  3. mise à jour le onProgressUpdate (appeler) à partir de votre doInBackground (String ... params) Méthode

EDIT: vous pouvez également donner une référence de votre vue EditText dans le constructeur AsyncTask et faire la mise à jour dans la méthode onProgressUpdate.

EDIT: utilisez ce code ..

public class NewClass extends Activity { 
/** Called when the activity is first created. */ 
EditText edt; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.newclass); 
    edt=(EditText)findViewById(R.id.ed); 

    new runRandomly(this,edt).execute(); 
} 


public class runRandomly extends AsyncTask<String, String, String> { 

String ranString=""; 
Activity activity; 
EditText edtt; 

public runRandomly(Activity activity,EditText edit) { 
    this.activity = activity; 
    edtt=edit; 
    } 

@Override 
protected String doInBackground(String... params) { 
    // TODO Auto-generated method stub 

    try{ 

     for(int a = 0; a < 33; a++) 
     { 
     Random rn = new Random(); 
     int i = rn.nextInt(256); 

     ranString = ranString + i + " "; 

     } 
     onProgressUpdate(); 
    } catch (Exception e) { 
     System.err.println("Error: " + e.getMessage()); 
    } 

    return null; 
} 

@Override 
protected void onPostExecute(String result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
} 

@Override 
protected void onProgressUpdate(String... values) { 
    // TODO Auto-generated method stub 

    edtt.setText(""+ranString); 
    super.onProgressUpdate(values); 
} 

} 


} 

simple, Thanx.

+0

Et si je veux démarrer à toutes les 10 secondes et pour chaque minute qui passe, soustraire 1 seconde des 10 secondes jusqu'à ce qu'elle soit inférieure à 1 seconde? – Si8

0

mettre cette ligne en dehors de la boucle il regénérer nouvel objet donc pas besoin en boucle

Random rn = new Random(); 

for(int a = 0; a < 33; a++) 
{ 
    int i = rn.nextInt(256); 

    ranString = ranString + i + " "; 
} 

vous devez gestionnaire et de l'objet Runnable qui appelle la méthode d'exécution AsynTask en utilisant l'objet runRandomly

aiment créer cet objet

Handler handler = new Handler(); 
runRandomly randomly = new runRandomly(); 


Runnable callRandom = new Runnable(){ 
    public void run(){ 
     //// call the execute method 
     randomly.execute(); 
     ///// here handler call this runnable every 1 sec i.e 1000 delay time 
     handler.postDelay(callRandom,1000); 
    } 
} 

à onBackground générer le nombre @Override protected String doInBackground (String ... params) { Chaîne ranString = "";

Random rn = new Random(); 

    for(int a = 0; a < 33; a++) 
    { 
     int i = rn.nextInt(256); 

     ranString = ranString + i + " "; 
    } 
    return ranString; 
} 

cette méthode ci-dessus va générer la chaîne de nombres aléatoires et quand il terminer ce qui revient à la chaîne postExecute();

@Override 
protected void onProgressUpdate(String values) { 
    super.onProgressUpdate(values); 
    if(values!=null & !values.equals("")) 
     txtMessage.setText(ranString); 

} 
+0

J'avais essayé mais j'ai échoué à travailler avec quelques erreurs, possible d'afficher le code? @Pratik – Ezylryb

+0

en particulier sur la partie gestionnaire @Pratik – Ezylryb

+0

quelle erreur vous avez? – Pratik

Questions connexes