2017-06-28 4 views
0

Quelle modification est nécessaire pour que la fonction getVehicleName() renvoie correctement le nom du véhicule au thread parent? Quelle sera la meilleure approche? J'ai essayé les fonctions de gestionnaire et de rappel, mais je me suis retrouvé avec des erreurs de compilation ("essayer d'assigner des privilèges d'accès plus faibles").Android: Quelle est la bonne approche pour retourner les valeurs d'une classe anonyme à thread?

fonction parent (code complet non collé)

Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 

        boolean val = checkifVehicleAvailable("1111A"); 
       } catch (Exception e){ 
       } 
      }); 

Fonctions

public boolean checkifVehicleAvailable(String drive_this) { 

    if(getVehicleName(drive_this).equals("1111A"){  
    return true; 
    } 
    return false; 
} 

// Need to be modified to return String 

public String getVehicleName(String ID){ 
    /*DB references*/ 
    //final String vehicleName; 
    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef; 
    DatabaseReference childRef; 

    myRef = database.getReference(); 
    childRef = myRef.child("vehicles"); 
    childRef.child(ID).addListenerForSingleValueEvent(new ValueEventListener() { 
     String vehicleSecretName; 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      vehicleName = dataSnapshot.child("vehicleName").getValue(String.class); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 
+0

S'il vous plaît, formatez votre code. Dans la première partie, vous utilisez 'try' sans' catch'. Vous écrivez 'getVehicleName (drive_this) .equals (" 1111A ")', mais getVehicleName est nul. – CoolMind

+0

Édité. Je suis à la recherche de la bonne approche pour modifier getVehicleName() afin de renvoyer la valeur de chaîne de la base de données firebase. – Sandeep

Répondre

0

Vous pouvez enregistrer la valeur dans les SharedPreferences et enregistrer un SharedPreferenceListener pour notifier cet auditeur si une certaine valeur a changé. L'auditeur pourrait ressembler à ça:

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if(key.equals("myKey") { 
     sharedPreferences.getString(key); 
     //do whatever after that > e.g. start your async task or load that value into an AsyncTask via execute(..) method. 
    } 
} 
0

vous Coult par exemple dire:

final boolean[] result = new boolean[1]; 

    Thread t = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     try { 
      boolean val = foo(); 
      result [0] = val; 
     } catch (Exception e){ 

     } 
    }); 
} 

private boolean foo(){ 
    return false; 
}