【问题标题】:AsyncTask Not throws exception in Android 2.3 AndengineAsyncTask Not 在 Android 2.3 Andengine 中抛出异常
【发布时间】:2013-04-06 03:19:38
【问题描述】:

我有一个在 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();时抛出异常

Exception的详细信息如下所示。

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

回到onCreateScene 的最后一行。但应用程序被冻结。 它在新的 android os(4.2) 中运行良好

请检查

从异常发生时的整个日志 04-07 17:46:42.498: W/dalvikvm(2552): 异常 Ljava/lang/RuntimeException;初始化 Landroid/os/AsyncTask 时抛出; 04-07 17:47:06.891:E/AndEngine(2552):StartingScreen.onPopulateScene 失败。 @(线程:'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): at 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): at com.gretrainer.gretrainer.StartingScreen.onCreateScene(StartingScreen.java:91) 04-07 17:47:06.891: E/AndEngine(2552): at 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.java: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): at 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.java:152) 04-07 17:47:06.891: E/AndEngine(2552): ... 11 更多 04-07 17:47:06.891:D/AndEngine(2552):StartingScreen.onSurfaceChanged(宽度=320,高度=480)@(线程:'GLThread 11') 04-07 17:47:07.102: D/dalvikvm(2552): GC_FOR_MALLOC 释放 142K,42% 释放 3211K/5447K,外部 1K/512K,暂停 26ms 04-07 17:47:07.102: I/dalvikvm-heap(2552): 将堆(碎片情况)增加到 6.457MB,分配 1382416 字节 04-07 17:47:07.222: D/dalvikvm(2552): GC_CONCURRENT freed 2K, 34% free 4559K/6855K, external 1K/512K, paused 3ms+4ms 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): 在 android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1960) 04-07 17:47:07.292: E/Database(2552): 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:906) 04-07 17:47:07.292: E/Database(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/Database(2552): 在 android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 04-07 17:47:07.292: E/Database(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): at com.gretrainer.gretrainer.AppHelpers.DatabaseHandler.getWordsCount(DatabaseHandler.java:213) 04-07 17:47:07.292: E/Database(2552): at 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): at com.gretrainer.gretrainer.StartingScreen.onCreateScene(StartingScreen.java:91) 04-07 17:47:07.292: E/Database(2552): at 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): at org.andengine.ui.activity.BaseGameActivity.onCreateGame(BaseGameActivity.java:181) 04-07 17:47:07.292: E/Database(2552): at org.andengine.ui.activity.BaseGameActivity.onSurfaceCreated(BaseGameActivity.java:110) 04-07 17:47:07.292: E/Database(2552): at org.andengine.opengl.view.EngineRenderer.onSurfaceCreated(EngineRenderer.java:80) 04-07 17:47:07.292: E/Database(2552): 在 android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1352) 04-07 17:47:07.292: E/Database(2552): 在 android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1122)

【问题讨论】:

  • 添加整个日志...当您可以看到整个堆栈跟踪时会容易得多...
  • 我已经添加了整个日志。请检查@StevenByle

标签: android multithreading andengine


【解决方案1】:

这只是一个猜测,但有几个Exceptions 导致您没有正确执行AsyncTask 的结论(请参阅Can't create handler inside thread that has not called Looper.prepare()。我不是建议您自己调用Looper.prepare(),而是执行Asynctask 在另一个线程上。所以不是

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

尝试这样的事情(顺便说一句,您正在访问任务中的一些变量,应该提前初始化):

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

我对@9​​87654328@s 的经验是,它们不应该在普通的Update Thread 上运行,因为这个线程仅用于刷新屏幕,所以请尝试在UIThread 上运行它(因为你不是直接从任务中显示数据)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2012-06-03
    • 2012-09-30
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多