2015-10-27 3 views
0
public class checkSchoolCodeQuery extends AsyncTask<String, Integer, String> { 
    EditText etSchoolCode = (EditText) findViewById(R.id.etSchoolCode); 
    String schoolcode = etSchoolCode.getText().toString(); 
    String isValid = "didn run"; 
    @Override 
    protected String doInBackground(String... params) { 

     final ParseQuery<ParseObject> query = ParseQuery.getQuery("Schools"); 

     query.whereEqualTo("schoolcode", schoolcode); 
     query.countInBackground(new CountCallback() { 
      @Override 
      public void done(int i, ParseException e) { 
       if (e == null) { 
        if (i == 1) { 
         // Check if expiry date is greater than today's date 
         query.getFirstInBackground(new GetCallback<ParseObject>() { 
          @Override 
          public void done(ParseObject parseObject, ParseException e) { 
           if (e == null) { 
            Date expiryDate = parseObject.getDate("expirydate"); 
            Date todaysDate = new Date(); 
            System.out.println(expiryDate); 
            if (expiryDate.after(todaysDate)) { 
             isValid = "true"; 
            } else { 
             isValid = "false"; 

             AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getApplicationContext()) 
               .setMessage("Your school doesnt have access"); 
            } 

           } else { 
            System.out.println("There was an error when checking if School Code was valid"); 
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getApplicationContext()) 
              .setMessage("There was an error when checking if School Code was valid"); 
            AlertDialog alertDialog = alertDialogBuilder.show(); 
            isValid = "didnt run"; 
           } 
          } 
         }); 
        } else { 
         isValid = "false"; 

         // Create Alert Dialog to show error text 
         AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getApplicationContext()) 
           .setMessage("The School Code is invalid"); 
         AlertDialog alertDialog = alertDialogBuilder.show(); 

        } 
       } else { 
        isValid = "didnt run"; 
        System.out.println("There was an error when checking if School Code was valid"); 
        // Create Alert Dialog to show error text 
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getApplicationContext()) 
          .setMessage("There was an error when checking if School Code was valid"); 
        AlertDialog alertDialog = alertDialogBuilder.show(); 

       } 
      } 
     }); 

    return isValid; 

    } 



    @Override 
    protected void onPostExecute(String aString) { 

     if (aString == "true") { 
      System.out.println("The school code is valid"); 
     } else if (aString == "false") { 
      System.out.println("The school coe is invalid"); 
     } 
     else { 
      System.out.println("There was an error"); 
     } 

    } 
} 

Когда я запускаю мой код, переменная isValid не обновляется, поэтому он использует начальное значение isValid строки. Исправляю ли я AsyncTask или я что-то пропустил? Как сделать обновление переменной в AsyncTask? Пожалуйста, помогите, поскольку я начинаю программировать. Я проверил другие вопросы, но они не относятся к моему делу; все они являются расширенными сценариями, и я не понимаю их код. Я просто ищу простую проблему с моей проблемой.Переменная не обновляется в AsyncTask, когда я запускаю его

+0

Пожалуйста, используйте enum для определения вашего состояния, используя строку для определения вашего состояния - это плохой код !!, во-вторых, используйте TextUtils.equals (a, b) для сравнения двух строк. – dex

+0

Он по-прежнему дает мне тот же результат, сравнивая строки, это не моя проблема, проблема в том, что переменные не обновляются в asynctask – user3147316

+0

приложите отладчик, проверьте, действительно ли ваш код его ударил или нет, а затем обновите строка. – dex

ответ

0

Вы сделали это слишком сложным, пытаясь использовать слишком много слоев фоновых потоков.

AsyncTask выполняет метод doInBackground в фоновом режиме. В этом случае вы начинаете запрос в еще одном фоновом потоке, чтобы обновить переменную isValid, тогда вы немедленно вернете текущее (неизмененное) значение isValid в результате AsyncTask, прежде чем запрос запустится. К моменту вызова обратного запроса значение isValid не будет отображаться снова, так как return isValid; уже выполнен.

Решение, поскольку вы уже находитесь в фоновом потоке в пределах AsyncTask.doInBackground, не используйте методы объекта запроса, которые выполняются на дополнительных потоках фона. В пределах AsyncTask.doInBackground выполните запросы напрямую. Это также позволит вам уменьшить область действия isValid на локальную переменную вместо поля. Или, поскольку ParseQuery - различные методы inBackground, по-видимому, уже разработаны специально для использования с потоком пользовательского интерфейса Android, возможно, вы можете использовать один из них без AsyncTask.

Я никогда не занимался программированием на базе Android, поэтому я не знаком ни с одним из этих классов, так что я мог бы еще раз увидеть, что мне не хватает.

Другая проблема, которая в настоящее время не вызывает проблемы в вашем коде, но это легко сделать, потому что это так непросто, пытается использовать String для хранения информации о состоянии программы. Это также хитрое сравнение с == вместо equals, хотя в настоящее время это безвредно, поскольку литералы String интернированы. Может быть, это просто тестовый код в то время как вы пытаетесь диагностировать другие проблемы, но если нет, то лучше было бы реализовать такое третье состояние с перечислением или обнуляемым Boolean, или что-то:

private enum Result { VALID, INVALID, DID_NOT_RUN } 
private Result validity = Result.DID_NOT_RUN; 
... 
Смежные вопросы