2016-04-13 2 views
-1

Я новичок в Android, и мне нужна помощь. Итак, у меня есть процедура с подпрограммами внутри. Как я могу закончить один, прежде чем начинать новый. Вот код, чтобы лучше понять:Завершить процедуру перед тем, как начинать новую.

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); 
    } 

Проблема заключается в том, что myJSONString пуст, причиной textCEllNameSkriven тоже пусто. Это textView textCellNameSkriven выполняется, когда getJSON (JSON_URL_string) завершен. Если я запустил отладчик и пошел шаг за шагом, приложение переходит непосредственно из строки getJSON (JSON_URL_string) в следующую и следующую и т. Д.

Редактировать: Возможно, проблема в том, что onPostExecute не завершен перед запуском ParseJSON. Здесь также код 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); 

    } 

ответ

0

Поскольку вы работаете задачу асинхронной практически работает в другом потоке, так что ваш метод getJson не нужно ждать пост выполнить и может вернуться после запуска задачи асинхронной, так вы никогда не сможете быть уверены в том, что parseJson запускается после заполнения textView. Вы столкнулись с проблемой классической гонки.

Ваш вопрос может быть легко решена, если у вас есть обратный вызов, который вызывается после того, как postExecute сделано, и вы можете справиться с parseJson там

Так, что-то простое, как, создать интерфейс MyCallback

public interface MyCallback { 
    public OnReadJsonDone(); 
} 

Пусть ваша деятельность реализовать эту MyCallback

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

Теперь изменить подпись getJson к

getJSON(string json, final MyCallback callback) { 

Сейчас в onpostexecute

//call OnReadJsonDone 
callback.OnReadJsonDone() 

Итак, все, что вам теперь нужно это время вызова getJSon передать это как вторые пары

getJSON(JSON_URL_string,this); 

Не проверял это, но вы получите идею

+0

Привет, спасибо за ответ. Можете ли вы предложить мне решение с кодом? Заранее спасибо. –

+0

дали краткий план, отдых, который вы можете взять оттуда –

Смежные вопросы