Asynctask (progressDialog) - не удалось установить область повреждения EGL_BAD_ACCESS - PullRequest
0 голосов
/ 23 марта 2019

Помогите мне - я действительно застрял в следующем вопросе:

Исключение выбрасывается за пределы JVM и не может быть обработано, если вы не знаете NDK.

03-23 17:48:24.463 18768-18913/se.android.appinfo E/Parcel: fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is 0, fds[i] is -1, fd_count is 1, error: Too many open files
03-23 17:48:24.464 18768-18913/se.android.appinfo I/OpenGLRenderer: Surface query width is 1440
03-23 17:48:24.464 18768-18913/se.android.appinfo A/OpenGLRenderer: Failed to set damage region on surface 0x7edceec8c0, error=EGL_BAD_ACCESS
03-23 17:48:24.467 18768-18913/se.android.appinfo A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 18913 (RenderThread)

Полагаю, последние из них об EGL и OpenGL ES актуальны здесь?

Я часами боролся, гуглил и не могу найти решения. И эта проблема для меня в новинку - со мной такого никогда не возникало - я создавал приложения перед использованием Asynctask и отображал диалоги выполнения во время загрузки.

Сбой происходит где-то между основной и фоновой нитями. Это происходит не каждый раз, может быть, 50% или что-то. Когда происходит сбой, когда doInBackground готов или почти готов, и вызывается onPostExecute.

Пожалуйста, обратите внимание на мой источник и помогите мне, если вы подозреваете что-либо, что вызывает исключение (фатальный сигнал).

source - пользовательский класс, расширяющий AsyncTask

 public class Async_loader extends AsyncTask <String, Integer, String> implements AppInfoRetriever.ProgressInterface {

private Context context;
private AppInfoRetriever appInfoRetriever;
private ProgressDialog progressDialog;

public Async_loader(Context context, AppInfoRetriever appInfoRetriever) {

    this.context = context;
    this.appInfoRetriever = appInfoRetriever;
    this.appInfoRetriever.setProgressInterface(this);

    progressDialog = new ProgressDialog(context);
    progressDialog.setCancelable(false);
    progressDialog.setIndeterminate(false);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.show();

}

public String doInBackground(String ... params) {

    try {
        appInfoRetriever.retrieve();
    } catch(PackageManager.NameNotFoundException nnfe) {

        nnfe.printStackTrace();
    }
    appInfoRetriever.splitToUserSystemApps();

    return "loading done";
}

@Override
public void onProgressUpdate(final Integer ... values) {

    progressDialog.setProgress(values[0]);
    progressDialog.setMessage("parsing apps: " + values[0]);
}


public void onPostExecute(String result) {


    System.err.println(result);
    progressDialog.dismiss();
}

/**
 * Callback från AppInfoRetriever
 * @param nItems
 * @param index
 */
@Override
public void appLoadingProgress(int nItems, int index) {

    publishProgress(index);

 }
}

Полезно знать: так как я хочу отделить код, я позволил AppInfoRetriever проанализировать приложения и во время синтаксического анализа отправлять (через интерфейс) информацию обратно в Async_loader. Я думал, что это может быть проблемой, но я пытался поднять в коде Async_loader, но безуспешно.

...