2013-09-16 3 views
0

У меня мало проблем с синтаксическими ошибками здесь. Ниже у меня есть alertDialog с sharedPreference, и если вам интересно, почему у меня это в asynctask, вы можете увидеть это Shared Prefence for alert dialog is making my application non responsive. Но проблема синтаксиса находится ниже installed в моем onPostExecute, и в нем говорится: «installed не может быть перенесено на переменную». У меня также есть еще один под settings в моем onPostExecute, который говорит то же самое. Я знаю, что это может показаться легким решением для некоторых людей, но я считаю, что это очень сложно для кого-то вроде меня. Я также советую вам посмотреть на ссылку, если у вас есть лучший способ, чем AsyncTask и onResume()Проблемы с ошибкой в ​​AsyncTask

@Override 
protected void onResume() { 

    class asynctask extends AsyncTask<String, String, String> { 

     @Override 
     protected String doInBackground(String... arg0) { 
      final SharedPreferences settings = getSharedPreferences("pref_name", 0); 
      boolean installed = settings.getBoolean("installed", false); 

      return null; 
     }}} 

    protected void onPostExecute(String file_ad) { 

     if(!installed){ 

      final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 

      alertDialog.setTitle("Title"); 
      alertDialog.setIcon(R.drawable.ic_launcher); 
      alertDialog.setAdapter(new MyAdapter(), null); 

      alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        SharedPreferences.Editor editor = settings.edit(); 
        editor.putBoolean("installed", true); 
        editor.commit(); 

       } 
      }); 

      alertDialog.show(); 
    } 
    super.onResume(); 
} 
+0

См. Мой ответ в связанном с вами вопросе. Надеюсь, это прояснит ситуацию. Я не знаю, почему вам сказали, что вы не можете делать какие-либо операции в 'onCreate()', это смешно. В этой ситуации нет необходимости в «AsyncTask». – codeMagic

ответ

1

installed объявлен только в doInBackground, так что не видно в onPostExecute.

вместо возвращения String в doInBackground (где на самом деле вы всегда возвращают null), вы должны вернуть boolean (который будет installed), и в onPostExecute изменения параметра для boolean и проверить его вместо тестирования installed.

EDIT

Принимая больше времени, чтобы обновить свой ответ:

Во-первых, я согласен с @codeMagic, вы определенно НЕ нужен AsyncTask, чтобы сделать это!

Но если вы действительно хотите сделать это таким образом, здесь, как вы могли бы сделать это: во-первых, вы должны изменить подпись вашего AsyncTask таким образом:

class asynctask extends AsyncTask<String, String, Boolean> { 

Тогда в doInBackground, изменить возвращение значение и вместо возвращения null, вернуть installed:

@Override 
protected boolean doInBackground(String... arg0) { 
     final SharedPreferences settings = getSharedPreferences("pref_name", 0); 
     boolean installed = settings.getBoolean("installed", false); 

     return installed; 
}}} 

и, наконец, изменить параметр onPostExecute принять boolean:

protected void onPostExecute(boolean installed) { 

Таким образом, вы можете проверить installed в своем методе.

+1

На самом деле, тип возврата должен быть 'Boolean' из-за использования дженериков. –

+0

Итак, @ inman-douche, вы нашли решение своей проблемы? – jbihan

0

Переменная installed является местной для метода doInBackground, onPostExecute не может его увидеть. Вы можете добавить переменный экземпляр:

class asynctask extends AsyncTask<String, String, String> { 
    boolean installed = false; 
    @Override protected String doInBackground(String... arg0) { 
    installed = true; 
    } 
} 

Или, вы можете изменить подпись вашей асинхронной задачи так, что она возвращает логическое значение, то просто возвратите устанавливаются из doInBackground и он будет передан в качестве параметра onPostExecute :

class asynctask extends AsyncTask<String, String, Boolean> { 
    @Override protected Boolean doInBackground(String... arg0) { 
    return true; 
    } 
    protected void onPostExecute(Boolean installed) { 
    } 
} 
Смежные вопросы