От време на време приложението ми ще се срива и дневникът ми ще гласи:
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
Понякога code=2
, но винаги Fatal signal 11
и invalid heap address
.
Опитах се да проуча какво означава това и как да го поправя. Тази тема е най-полезната; обаче все още съм без решение.
Грешката възниква, когато стартирам няколко AsyncTasks
, за да изтегля няколко изображения.
Това е моят основен AsyncTask
public class FetchArtistImages extends AsyncTask<Void, Integer, String[]> implements Constants {
private final WeakReference<Context> contextReference;
public FetchArtistImages(Context context) {
contextReference = new WeakReference<Context>(context);
}
@Override
protected String[] doInBackground(Void... params) {
String[] projection = new String[] {
Audio.Artists._ID, Audio.Artists.ARTIST
};
String sortOrder = Audio.Artists.DEFAULT_SORT_ORDER;
Uri uri = Audio.Artists.EXTERNAL_CONTENT_URI;
Cursor c = contextReference.get().getContentResolver()
.query(uri, projection, null, null, sortOrder);
ArrayList<String> artistIds = new ArrayList<String>();
if (c != null) {
int count = c.getCount();
if (count > 0) {
final int ARTIST_IDX = c.getColumnIndex(Audio.Artists.ARTIST);
for (int i = 0; i < count; i++) {
c.moveToPosition(i);
artistIds.add(c.getString(ARTIST_IDX));
}
}
c.close();
c = null;
}
return artistIds.toArray(new String[artistIds.size()]);
}
@Override
protected void onPostExecute(String[] result) {
for (int i = 0; i < result.length; i++) {
new LastfmGetArtistImages(contextReference.get()).executeOnExecutor(
AsyncTask.THREAD_POOL_EXECUTOR, result[i]);
}
super.onPostExecute(result);
}
Въпреки че се опитах да проуча какво става с това, все още се чувствам изгубен, когато трябва да го поправя. Ако някой има някаква представа, определено ще се радвам да го видя. Грешката не се извежда всеки път, когато execute
моя AsyncTasks
, но не мога да намеря много модел, който да помогне да се изолира защо това се случва. Има няколко други теми на SO относно fatal signal 11
, но те не предоставят голяма помощ в моя случай.