multithreading - AsyncTask Not throws exception in Android 2.3 Andengine -
i have code runs in google nexus(android 4.2). when tried yesterday in lower version android 2.3.5 throws exception.
please me resolve same.
details.
i created class downloadhelper me download file internet location in phone. class intern calls sub class downloadfile extends asynctask. when try create object of downloadfile throws exception.
below code of 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(); // useful can show typical 0-100% progress bar int filelength = connection.getcontentlength(); // download 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 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] + "%"); } } } the exception thrown when executes line downloadfile = new downloadfile();
the details of exception shown below.
updatethread interrupted. don't worry - enginedestroyedexception expected! org.andengine.engine.engine$enginedestroyedexception it goes last line of oncreatescene. app freezed. works fine in new android os(4.2)
please check
entire log time of exception 04-07 17:46:42.498: w/dalvikvm(2552): exception ljava/lang/runtimeexception; thrown while initializing landroid/os/asynctask; 04-07 17:47:06.891: e/andengine(2552): startingscreen.onpopulatescene failed. @(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): @ 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.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): @ 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): caused by: java.lang.runtimeexception: can't create handler inside thread has not called 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 more 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 freed 142k, 42% free 3211k/5447k, external 1k/512k, paused 26ms 04-07 17:47:07.102: i/dalvikvm-heap(2552): grow heap (frag case) 6.457mb 1382416-byte allocation 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() never explicitly called on database '/data/data/com.gretrainer.gretrainer/databases/greapp' 04-07 17:47:07.292: e/database(2552): android.database.sqlite.databaseobjectnotclosedexception: application did not close cursor or database object opened here 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): @ 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): @ 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): @ 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): @ 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)
this guess several of exceptions lead conclusion not executing asynctask correctly (see can't create handler inside thread has not called looper.prepare(). not suggesting, calling looper.prepare() yourself, executing asynctask on thread. instead of
downloadfile = new downloadfile(); loadingtext = loadingt; activity = activity1; downloadfile.execute(url); startingpercent = 0; endingpercent = 100; filename = _filename; tag = _tag; try (btw, accessing variables within task, should initialized earlier):
loadingtext = loadingt; activity = activity1; startingpercent = 0; endingpercent = 100; filename = _filename; tag = _tag; runonuithread(new runnable() { @override public void run() { new downloadfile().execute(url); } }); my experience asynctasks is, shouldn't run on normal update thread, since thread refreshing screen only, try running on uithread instead (since not displaying data directly within task).
Comments
Post a Comment