2016-04-15 24 views
0

Ich bin neu bei Android. Ich habe zu viel Zeit damit verbracht, dieses Problem ohne Erfolg zu lösen.Zugriff auf Variablen aus Async Aufgabe

So habe ich Service Serv.java.

public class Serv extends Service { 
private String a = "aa"; 
private String b = "bb"; 
private String c = "100"; 

//called by some class. 
public void setcc(String s) { 
c=s;//c="cc" 
} 

//Using alarm manager to start the service. 
//I call function callMe from OnStart. 

void callMe(Context context){ 
//which calls an async task 
new VAsyncTask().execute(""); 
} 

private class VerifyCPIAsyncTask extends AsyncTask<String, Void, Void> { 

    protected void onPreExecute() { 

    } 

    protected Void doInBackground(String... urls) { 
    //I am able to access a and b.(aa and bb) 
    //but not c.(It still shows 100 and not cc) 
    } 
    ........ 
    } 

Aber wenn ich den gleichen Service laufen wieder zeigt es korrekten Wert für c (cc) .Es ist Problem, wenn ich zum ersten Mal bin erreichbar.

EDIT- Der Fluss funktioniert gut, wenn ich privaten String c zu privaten statischen String c. Und ich habe Logs in meine onCreate und onStartCommand.They nicht den neuesten Wert der Variablen c.so gibt es keine Verwendung übergeben (neueste) Variable c zu Preexecute oder sogar einen Konstruktor in der aysnctask (weil ich immer noch die alter Wert der Variablen c).

Bitte helfen. Danke.

+0

Warum können Sie mit der 'Preexecute' Methode in der' Asynctask' nicht die Parameter einstellen, die Sie jemals verwenden möchten? – jgm

+1

Ohne den Prozess ein bisschen mehr zu kennen und zu verstehen, wie Sie alles nutzen, was ich annehmen kann, ist dies eine Race Condition oder etwas. – zgc7009

+0

Hi könnt ihr euch das bitte ansehen [link] (https://stackoverflow.com/questions/36689841/cannot-access-values-first-time) –

Antwort

0

es ist schwer zu sagen, ohne zu wissen von wo/was und wie ist Ihre Strömung?

Sie können den Konstruktor überschreiben und die Werte als async Task-Parameter übergeben.

*

private class VerifyCPIAsyncTask extends AsyncTask<String, Void, Void> 
{ 
    int cc 
    VerifyCPIAsyncTask (int a) { 
     cc= a; 
    } 
    protected void onPreExecute() { 
    } 
}* 

und rufen Sie Ihre async Aufgabe als neue VAsyncTask (cc) .execute ("");

ist es sicherer Ansatz.

+0

Hi könnt ihr euch das bitte anschauen [link] (https://stackoverflow.com/questions/36689841/cannot-access-values-first-time) –