Android Почему мое приложение принудительно закрывается?

Признаюсь, я новичок во всей этой Android-штучке. Я пытаюсь создать приложение, но случайно получаю ошибки принудительного закрытия, и я действительно не знаю, почему. В моем приложении много действий, ни одно из них не завершается(), когда я начинаю новое. Я получаю данные из Интернета (через веб-сервисы и прямую загрузку изображений) и часто использую AsyncTask. Большую часть времени он падает на асинтаске. Вот пример того, как я делаю вещи:

private BackTask backTask;
Activity ctx = this;

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.trackslist);

        backTask = new BackTask();
            backTask.execute();
    }

    protected class BackTask extends AsyncTask<Context, String, myObject>
        {
            @Override
            protected myObject doInBackground(Context... params) 
            {
                 try{
                        if (hasInternet(ctx)==true)
                        {
                            //access the web SERVICE here
                        //initialize myObject WITH result FROM the web
                         return myObject
                       }
                       else
                       {
                            return null
                       }

                  }catch(Exception ex){
                       return null;
                }
            }

            @Override
            protected void onPreExecute()
            {
                    super.onPreExecute();
            }

            @Override
            protected void onProgressUpdate(String... values) 
            {
                    super.onProgressUpdate(values);
            }

            @Override
            protected void onCancelled()
            {
                    super.onCancelled();
            }

            @Override
            protected void onPostExecute( myObject result ) 
            {
                    super.onPostExecute(result);
                    if (result==null || result.isEmpty())
                    {
                           //no valid result, show a message
                    }
                    else
                    {
                        //result valid do something with it
                    }
            }
        }

     @Override
        public void onPause()
        {
            if (backTask!=null && ! backTask.isCancelled())
            {
                backTask.cancel(true);
            }
            super.onPause();
        }

    public void btnStartOnClick(View target) {
          Intent intent = new Intent(this, MyNewActivity.class); 
      startActivity(intent);
 }

Когда активность получает onPause(), задача отменяется. Я не уверен, что происходит во время попытки/поймать, если появляется ошибка, из того, что я сделал, он должен возвращать ноль, но я думаю, что здесь я что-то упускаю. Как я уже говорил, случайным образом я приближаюсь к силе, даже если я нахожусь в другом действии. Это действительно расстраивает, поскольку я не могу предложить приложение с таким поведением. Итак, что я делаю неправильно?


person Alin    schedule 19.11.2010    source источник
comment
если есть FC, вы должны проверить журнал («adb shell logcat» в командной строке из каталога sdk/tools или в представлении Eclipse DDMS). Затем вставьте сюда журнал ошибок.   -  person Mathias Conradt    schedule 19.11.2010
comment
Я проверил журнал, и, возможно, это исключение нулевого указателя в асинхронной задаче... дело в том, что я занимаюсь другим действием, когда получаю сообщение.   -  person Alin    schedule 19.11.2010


Ответы (2)


Вам нужно спросить в классе AsyncTask о isCancelled(), а затем решить, что делать.

Проверьте этот вопрос. У Ромена Ги есть хорошее объяснение:

Вы можете остановить AsyncTask. Если вы вызываете cancel(true), в фоновый поток будет отправлено прерывание, что может помочь прерываемым задачам. В противном случае вам следует просто регулярно проверять isCancelled() в методе doInBackground(). Вы можете увидеть примеры этого на code.google.com/p/shelves.

person Macarse    schedule 19.11.2010

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

public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.trackslist);

     backTask = new BackTask();
     backTask.execute(this);
}
person Umakant Patil    schedule 19.11.2010
comment
Я никогда не использовал выполнение (это). Любопытно, что мне не удалось найти никакой информации, запрашивается она или нет. Не могли бы вы немного пояснить, зачем это нужно? Спасибо. - person Alin; 19.11.2010
comment
Алин, не надо. Вы определили Context, так как первый параметр расширяет AsyncTask‹Context, String, myObject›, поэтому вам нужно передать его. Если вам не нужно ничего передавать, тогда поставьте Void в качестве первого параметра. - person Umakant Patil; 19.11.2010
comment
Теперь я понимаю, хорошая мысль. Интересно, как работает. Что происходит в попытке поймать, если что-то пойдет не так? Возвращает ли он значение null для onPostExecute? - person Alin; 19.11.2010