Android Почему мое приложение принудительно закрывается? - PullRequest
1 голос
/ 19 ноября 2010

Признаюсь, я новичок во всем этом Android.Я пытаюсь создать приложение, но случайно получаю ошибки Force close, и я действительно не знаю почему.Мое приложение имеет много действий, ни одно из них не завершает (), когда я запускаю новое.Я получаю данные из Интернета (через веб-сервисы и прямую загрузку изображений) и часто использую 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 (), задача отменяется.Я не уверен, что произойдет во время try / catch, если появится ошибка, из того, что я сделал, она должна вернуть ноль, но я думаю, что здесь я что-то упускаю.Как я уже говорил ранее, случайно получаю силу, близкую, даже если я нахожусь на другой Деятельности.Это действительно расстраивает, так как я не могу предложить приложение с таким поведением.Итак, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

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

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

     backTask = new BackTask();
     backTask.execute(this);
}
0 голосов
/ 19 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...