2016-04-13 9 views
-1

Ich bin Anfänger in Android und ich brauche Hilfe. Also, ich habe eine Prozedur mit Sub-Prozeduren innerhalb. Wie kann ich einen beenden, bevor ich einen neuen starte? Hier ist ein Code besser zu verstehen:Beenden Sie den Vorgang, bevor Sie einen neuen starten

public void onCellLocationChanged(CellLocation lokacija) { 
     super.onCellLocationChanged(lokacija); 
     location = (GsmCellLocation) Phone.getCellLocation(); 
     textCellId.setText(String.valueOf(location.getCid() % 65536)); 
     textCellLac.setText(String.valueOf(location.getLac())); 
     String JSON_URL_string=JSON_URL + "?cellid=" + String.valueOf(location.getCid()%65636); 
     getJSON(JSON_URL_string); 
     myJSONString = textCellNameSakriven.getText().toString(); 
     ParseJSON(myJSONString); 
    } 

Problem ist, dass myJSONString leer ist, verursachen textCEllNameSkriven auch leer. Dieser textView textCellNameSkriven wird erstellt, wenn getJSON (JSON_URL_string) beendet ist. Wenn ich den Debugger starte und Schritt für Schritt gehe, geht die App direkt von getJSON (JSON_URL_string) in die nächste Zeile und die nächste usw.

Edit: Vielleicht ist das Problem, dass onPostExecute nicht beendet ist, bevor ParseJSON gestartet wird. Hier ist auch ein Code für getJSON:

private void getJSON(String url) { 
     class GetJSON extends AsyncTask<String, Void, String> { 
      ProgressDialog loading; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       loading = ProgressDialog.show(MainActivity.this, "Please Wait...", null, true, true); 
      } 

      @Override 
      protected String doInBackground(String... params) { 

       String uri = params[0]; 

       BufferedReader bufferedReader = null; 
       try { 
        URL url = new URL(uri); 
        HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
        StringBuilder sb = new StringBuilder(); 

        bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream())); 
        String json; 
        while ((json = bufferedReader.readLine()) != null) { 
         sb.append(json + "\n"); 

        } 

        return sb.toString().trim(); 

       } catch (Exception e) { 
        return null; 
       } 

      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       loading.dismiss(); 
       textCellNameSakriven.setText(s); 
      } 
     } 
     GetJSON gj = new GetJSON(); 
     gj.execute(url); 

    } 

Antwort

0

Da Sie eine Asynchron-Aufgabe ausgeführt wird es praktisch auf einem anderen Thread ausgeführt wird, so dass Ihre getJSON Methode nicht für die Post warten muß ausführen und zurückkehren kann, nachdem die Asynchron-Aufgabe starten, so Sie können auf diese Weise nie sicher sein, dass parseJson ausgeführt wird, nachdem textView aufgefüllt wurde. Sie geraten in das klassische Race-Condition-Problem.

Ihr Problem leicht werden könnte gelöst werden, wenn Sie einen Rückruf haben, die nach PostExecute genannt wird getan wird, und Sie können parseJson dort behandeln

So etwas Einfaches wie, erstellen Schnittstelle MyCallback

public interface MyCallback { 
    public OnReadJsonDone(); 
} 

lassen Sie Ihre Aktivität

public MainActivity implements MyCallback 
{ 
    ........... 
    @Override 
    public OnReadJsonDone(){ 
     parseJson(); 
    } 

Jetzt Unterschrift getJSON änderndieses MyCallback implementieren

getJSON(string json, final MyCallback callback) { 

Jetzt in OnPostExecute

//call OnReadJsonDone 
callback.OnReadJsonDone() 

Also, alles, was Sie jetzt brauchen, ist während getJSON dies als zweite param

getJSON(JSON_URL_string,this); 
passieren Aufruf

nicht getestet haben, aber Sie bekommen die Idee

+0

Hallo, danke für die Antwort. Können Sie mir eine Lösung mit einem Code vorschlagen? Danke im Voraus. –

+0

haben einen kurzen Überblick gegeben, Ruhe, die Sie von dort nehmen können –

Verwandte Themen