AsyncTask не выдает исключение в Android 2.3 Andengine

У меня есть код, который успешно работает в Google Nexus (Android 4.2). Но когда я попробовал это вчера в более низкой версии с Android 2.3.5, он выдает исключение.

Пожалуйста, помогите мне решить то же самое.

Подробности.

Я создал класс DownloadHelper, который помогает мне загрузить файл из Интернета в папку на моем телефоне. Этот стажер класса вызывает подкласс DownloadFile extends AsyncTask. Когда я пытаюсь создать объект DownloadFile, он выдает исключение.

Ниже приведен код DownloadHeper

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import org.andengine.entity.text.Text;
import org.andengine.ui.activity.BaseGameActivity;

import com.gretrainer.gretrainer.StartingScreen;

import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;

public class DownloadHelper {
    public void loadFile(String url,Text loadingT,BaseGameActivity activity1,String _filename,int _tag){
        DownloadFile downloadFile;
        try {
            downloadFile = new DownloadFile();
            loadingText = loadingT;
            activity = activity1;
            downloadFile.execute(url);
            StartingPercent = 0;
            EndingPercent = 100;
            filename = _filename;
            tag = _tag;
        } catch (Exception e) {
            Log.d("exec",e.getLocalizedMessage());
        }



    }

    private int tag;
    private String filename;
    private float StartingPercent;
    private float EndingPercent;
    private BaseGameActivity activity;
    private Text loadingText;
    private class DownloadFile extends AsyncTask<String,Integer,String>{

        public DownloadFile(){

        }

        @Override
        protected String doInBackground(String... sUrl) {
            try {
                URL url = new URL(sUrl[0]);
                URLConnection connection = url.openConnection();
                connection.connect();
                // this will be useful so that you can show a typical 0-100% progress bar
                int fileLength = connection.getContentLength();

                // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().toString().concat(File.separator + filename));


                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
                StartingScreen act = (StartingScreen)activity;
                act.onLoadFileComplete(tag);
            } catch (Exception e) {
                String message = e.getLocalizedMessage();
                Log.d("hello",message);
            }
            return null;
        }

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

            @Override
            protected void onProgressUpdate(Integer... progress) {
                super.onProgressUpdate(progress);
                activity.runOnUiThread(new Runnable(){

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub

                    }

                });
                //loadingText.setText(StartingPercent + ((EndingPercent - StartingPercent) / 100) * progress[0] + "%");
            }


    }
}

Исключение возникает при выполнении строки downloadFile = new DownloadFile();

Подробная информация об исключении показана ниже.

UpdateThread interrupted. Don't worry - this EngineDestroyedException is most likely expected!
org.andengine.engine.Engine$EngineDestroyedException

Он восходит к последней строке onCreateScene. но приложение зависло. Он отлично работает в новой ОС Android (4.2)

пожалуйста, проверьте

Это всего лишь предположение, но некоторые из DownloadHelper приводят к выводу, что вы неправильно выполняете DownloadFile extends AsyncTask (см. DownloadFile. Я не предлагаю вызывать DownloadHeper самостоятельно, а выполнять

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import org.andengine.entity.text.Text;
import org.andengine.ui.activity.BaseGameActivity;

import com.gretrainer.gretrainer.StartingScreen;

import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;

public class DownloadHelper {
    public void loadFile(String url,Text loadingT,BaseGameActivity activity1,String _filename,int _tag){
        DownloadFile downloadFile;
        try {
            downloadFile = new DownloadFile();
            loadingText = loadingT;
            activity = activity1;
            downloadFile.execute(url);
            StartingPercent = 0;
            EndingPercent = 100;
            filename = _filename;
            tag = _tag;
        } catch (Exception e) {
            Log.d("exec",e.getLocalizedMessage());
        }



    }

    private int tag;
    private String filename;
    private float StartingPercent;
    private float EndingPercent;
    private BaseGameActivity activity;
    private Text loadingText;
    private class DownloadFile extends AsyncTask<String,Integer,String>{

        public DownloadFile(){

        }

        @Override
        protected String doInBackground(String... sUrl) {
            try {
                URL url = new URL(sUrl[0]);
                URLConnection connection = url.openConnection();
                connection.connect();
                // this will be useful so that you can show a typical 0-100% progress bar
                int fileLength = connection.getContentLength();

                // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().toString().concat(File.separator + filename));


                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
                StartingScreen act = (StartingScreen)activity;
                act.onLoadFileComplete(tag);
            } catch (Exception e) {
                String message = e.getLocalizedMessage();
                Log.d("hello",message);
            }
            return null;
        }

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

            @Override
            protected void onProgressUpdate(Integer... progress) {
                super.onProgressUpdate(progress);
                activity.runOnUiThread(new Runnable(){

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub

                    }

                });
                //loadingText.setText(StartingPercent + ((EndingPercent - StartingPercent) / 100) * progress[0] + "%");
            }


    }
}
в другом потоке. Поэтому вместо


person Geo Paul    schedule 06.04.2013    source источник
comment
Я добавил весь журнал. Пожалуйста, проверьте @StevenByle   -  person Steven Byle    schedule 06.04.2013
comment
Весь журнал с момента исключения 04-07 17:46:42.498: W/dalvikvm(2552): Exception Ljava/lang/RuntimeException; выдается при инициализации Landroid/os/AsyncTask; 04-07 17:47:06.891: E/AndEngine(2552): сбой StartingScreen.onPopulateScene. @(Thread: 'GLThread 11') 04-07 17:47:06.891: E/AndEngine(2552): java.lang.ExceptionInInitializerError 04-07 17:47:06.891: E/AndEngine(2552): в com.gretrainer .gretrainer.AppHelpers.DownloadHelper.loadFile(DownloadHelper.java:24) 04-07 17:47:06.891: E/AndEngine(2552): в com.gretrainer.gretrainer.StartingScreen.onPopulateScene(StartingScreen.java:102) 04- 07 17:47:06.891: E/AndEngine(2552): at org.andengine.ui.activity.BaseGameActivity$2.onCreateSceneFinished(BaseGameActivity.java:154) 04-07 17:47:06.891: E/AndEngine(2552): на com.gretrainer.gretrainer.StartingScreen.onCreateScene(StartingScreen.java:91) 04-07 17:47:06.891: E/AndEngine(2552): на org.andengine.ui.activity.BaseGameActivity$3.onCreateResourcesFinished(BaseGameActivity.java :169) 04-07 17:47:06.891: E/AndEngine(2552): в com.gretrainer.gretrainer.StartingScreen.onCreateResources(StartingScreen.java:68) 04-07 17:47:06.891: E/AndEngine(2552 ): в org.andengine.ui.activity.BaseGameActivity.onCreateGame(BaseGameActivity.jav a:181) 04-07 17:47:06.891: E/AndEngine(2552): в org.andengine.ui.activity.BaseGameActivity.onSurfaceCreated(BaseGameActivity.java:110) 04-07 17:47:06.891: E/ AndEngine(2552): в org.andengine.opengl.view.EngineRenderer.onSurfaceCreated(EngineRenderer.java:80) 04-07 17:47:06.891: E/AndEngine(2552): в android.opengl.GLSurfaceView$GLThread.guardedRun (GLSurfaceView.java:1352) 04-07 17:47:06.891: E/AndEngine(2552): в android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1122) 04-07 17:47:06.891: E /AndEngine(2552): Причина: java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не вызывал Looper.prepare() 04-07 17:47:06.891: E/AndEngine(2552): на android. os.Handler.(Handler.java:121) 04-07 17:47:06.891: E/AndEngine(2552): в android.os.AsyncTask$InternalHandler.(AsyncTask.java:421) 04-07 17:47: 06.891: E/AndEngine(2552): в android.os.AsyncTask$InternalHandler.(AsyncTask.java:421) 04-07 17:47:06.891: E/AndEngine(2552): в android.os.AsyncTask.(AsyncTask .jav a:152) 04-07 17:47:06.891: E/AndEngine(2552): ... еще 11 04-07 17:47:06.891: D/AndEngine(2552): StartingScreen.onSurfaceChanged(Width=320, Height =480) @(Thread: 'GLThread 11') 04-07 17:47:07.102: D/dalvikvm(2552): GC_FOR_MALLOC освобождено 142K, 42% свободно 3211K/5447K, внешний 1K/512K, пауза 26 мс 04-07 17 :47:07. 102: I/dalvikvm-heap(2552): увеличить размер кучи (фрагмент) до 6,457 МБ для выделения 1382416 байт 6855K, внешний 1K/512K, пауза 3 мс+4 мс 04-07 17:47:07.222: D/AndEngine(2552): StartingScreen.onResumeGame @(Thread: 'main') 04-07 17:47:07.292: E/Database (2552): функция close() никогда не вызывалась явно в базе данных '/data/data/com.gretrainer.gretrainer/databases/GreApp' 04-07 17:47:07.292: E/Database(2552): android.database.sqlite .DatabaseObjectNotClosedException: приложение не закрыло курсор или объект базы данных, который был открыт здесь 04-07 17:47:07.292: E/Database(2552): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1960) 04- 07 17:47:07.292: E/база данных (2552): в android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:906) 04-07 17:47:07.292: E/база данных (2552): в android. database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:940) 04-07 17:47:07.292: E/Database(2552) : в android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:933) 04-07 17:47:07.292: E/Database(2552): в android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:744) 04 -07 17:47:07.292: E/база данных(2552): в android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 04-07 17:47:07.292: E/база данных(2552): в android.database .sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 04-07 17:47:07.292: E/Database(2552): в android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:198) 04-07 17 :47:07.292: E/Database(2552): на com.gretrainer.gretrainer.AppHelpers.DatabaseHandler.getWordsCount(DatabaseHandler.java:213) 04-07 17:47:07.292: E/Database(2552): на com. gretrainer.gretrainer.StartingScreen.onPopulateScene(StartingScreen.java:100) 04-07 17:47:07.292: E/Database(2552): at org.andengine.ui.activity.BaseGameActivity$2.onCreateSceneFinished(BaseGameActivity.java:154) 04-07 17:47:07.292 : E/Database(2552): на com.gretrainer.gretrainer.StartingScreen.onCreateScene(StartingScreen.java:91) 04-07 17:47:07.292: E/Database(2552): на org.andengine.ui.activity. BaseGameActivity$3.onCreateResourcesFinished(BaseGameActivity.java:169) 04-07 17:47:07.292: E/Database(2552): at com.gretrainer.gretrainer.StartingScreen.onCreateResources(StartingScreen.java:68) 04-07 17:47 :07.292: E/Database(2552): в org.andengine.ui.activity.BaseGameActivity.onCreateGame(BaseGameActivity.java:181) 04-07 17:47:07. 292: E/Database(2552): в org.andengine.ui.activity.BaseGameActivity.onSurfaceCreated(BaseGameActivity.java:110) 04-07 17:47:07.292: E/Database(2552): в org.andengine.opengl .view.EngineRenderer.onSurfaceCreated(EngineRenderer.java:80) 04-07 17:47:07.292: E/Database(2552): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1352) 04-07 17 :47:07.292: E/база данных(2552): в android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1122)   -  person Geo Paul    schedule 07.04.2013


Ответы (1)


попробуйте что-то вроде этого (кстати, вы обращаетесь к некоторым переменным в своей задаче, которые должны быть инициализированы ранее):

downloadFile = new DownloadFile();
loadingText = loadingT;
activity = activity1;
downloadFile.execute(url);
StartingPercent = 0;
EndingPercent = 100;
filename = _filename;
tag = _tag;

Мой опыт работы с AsyncTask заключается в том, что они не должны работать на обычном Update Thread, поскольку этот поток предназначен только для обновления экрана, поэтому попробуйте вместо этого запустить его на UIThread (поскольку вы не отображаете данные непосредственно из задачи).

loadingText = loadingT;
activity = activity1;   
StartingPercent = 0;
EndingPercent = 100;
filename = _filename;
tag = _tag; 
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        new DownloadFile().execute(url);
    }
});

Добавьте весь журнал... это намного проще, когда вы можете видеть всю трассировку стека...

person GameDroids    schedule 08.04.2013