NullPointerException при выполнении диалога при экспорте в CSV - Android - PullRequest
0 голосов
/ 02 марта 2019

Я получаю исключение нулевого указателя на контекст независимо от того, как я изменяю класс предварительного исполнения или объявление ProgressBar. Я пробовал несколько решений, которые другие реализовали, чтобы исправить ошибку, но ничего не работает.

Мое приложение должно экспортировать CSV при нажатии кнопки в CatalogActivity.

Уже потратил несколько дней на это ... Ваша помощь очень ценится.

CatalogActivity:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {

                //export data to CSV using method in InventoryProvider via separate java class ExportDatabaseCSVTask
            case  R.id.export_to_csv:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

                    new ExportDatabaseCSVTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

                } else {

                    new ExportDatabaseCSVTask().execute("");
                }

ExportDatabaseCSVTask:

public class ExportDatabaseCSVTask extends AsyncTask<String, String, Boolean> {


    private Context context;
    private ProgressDialog dialog;
    InventoryProvider iProvider;



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


        dialog = new ProgressDialog(context);  ---ERROR HERE

        this.dialog.setMessage("Saving. Please Wait...");
       this.dialog.show();
    }



    @TargetApi(Build.VERSION_CODES.O)
    protected Boolean doInBackground(final String... args) {

        File exportDir = new File(Environment.getExternalStorageDirectory(), "/codesss/");
        if (!exportDir.exists()) { exportDir.mkdirs(); }

        File file = new File(exportDir, "inventory.csv");
        try {
            file.createNewFile();
            CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
            Cursor curCSV = iProvider.raw(CONTENT_URI);
            csvWrite.writeNext(curCSV.getColumnNames());
            while(curCSV.moveToNext()) {
                String arrStr[]=null;
                String[] mySecondStringArray = new String[curCSV.getColumnNames().length];
                for(int i=0;i<curCSV.getColumnNames().length;i++)
                {
                    mySecondStringArray[i] =curCSV.getString(i);
                }
                csvWrite.writeNext(mySecondStringArray);
            }
            csvWrite.close();
            curCSV.close();
            return true;

        } catch (IOException e) {
            return false;
        }
    }

    protected void onPostExecute(final Boolean success) {
        if (this.dialog.isShowing()) { this.dialog.dismiss(); }
        if (success) {
            Toast.makeText(CatalogActivity.getApplicationContext, "this is my Toast message!!! =)",  Toast.LENGTH_LONG).show();
            ShareFile();
        } else {
            Toast.makeText(CatalogActivity.getApplicationContext, "Export failed", Toast.LENGTH_SHORT).show();
        }
    }

    private void ShareFile() {
        File exportDir = new File(Environment.getExternalStorageDirectory(), "/codesss/");
        String fileName = "myfile.csv";
        File sharingGifFile = new File(exportDir, fileName);
        Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
        shareIntent.setType("application/csv");
        Uri uri = Uri.fromFile(sharingGifFile);
        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
        CatalogActivity.getApplicationContext.startActivity(Intent.createChooser(shareIntent, "Share CSV"));
    }

Logcat:

2019-03-02 21: 05: 16.109 7122-7122 / com.example.android.name E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.android.stockpile, PID: 7122 java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.res.Resources $ Theme android.content.Context.getTheme ()' для ссылки на пустой объект в android.app.AlertDialog.resolveDialogTheme (AlertDialog.java:224)на android.app.AlertDialog. (AlertDialog.java:201) на android.app.AlertDialog. (AlertDialog.java:197) на android.app.AlertDialog. (AlertDialog.java:142) на android.app.ProgressDialog. (ProgressDialog.java:94) в com.example.android.stockpile.ExportDatabaseCSVTask.onPreExecute (ExportDatabaseCSVTask.java:40) в android.os.AsyncTask.executeOnExecutor (AsyncTask.java:648) в com.example.alog.onOptionsItemSelected (CatalogActivity.java:199) в android.app.Activity.onMenuItemSelected (Activity.java:3435) в android.support.v4.app.FragmentActivity.onMenuItemSelected (FragmentActivity.java:436) в android.support.v7.app.AppCompatActivity.onMenuItemSelected (AppCompatActivity.java:196) в android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected (WindowCallbackWrapper.java:109) в android.support.v7.app.AppClmpempateandroid.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected (MenuBuilder.java:840) в android.support.v7.view.menu.MenuItemImpl.invoke (MenuItemImpl.java:158) в android.support.vmenu.MenuBuilder.performItemAction (MenuBuilder.java:991) в android.support.v7.view.menu.MenuBuilder.performItemAction (MenuBuilder.java:981) в android.support.v7.widget.ActionMenuView.jenuIv (625) на android.support.v7.view.menu.ActionMenuItemView.onClick (ActionMenuItemView.java:151) на android.view.View.performClick (View.java:6256) на android.view.View $ PerformClick.run (View.java:24701) на android.os.Handler.handleCallback (Handler.java:789) на android.os.Handler.dispatchMessage (Обработчик.java: 98) в android.os.Looper.loop (Looper.java:164) в android.app.ActivityThread.main (ActivityThread.java:6541) в java.lang.reflect.Method.invoke (собственный метод) вcom.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767) 2019-03-02 21: 05: 16.114 1694-4875 / system_process W / ActivityManager: Принудительно завершить действие com.example.android.name/.CatalogActivity

Если я попытаюсь добавить ниже в ExportDatabaseCSVTask:

public ExportDatabaseCSVTask(Context context) {
        this.context = context;
    }

Я получаю следующую ошибкув CatalogActivity:

 case  R.id.export_to_csv:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

                    new ExportDatabaseCSVTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - ERROR

                } else {

                    new ExportDatabaseCSVTask().execute(""); --ERROR
                }

ошибка: конструктор ExportDatabaseCSVTask в классе ExportDatabaseCSVTask не может быть применен к заданным типам;new ExportDatabaseCSVTask (). executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR);^ обязательно: контекст найден: аргументы отсутствуют причина: фактические и формальные списки аргументов различаются по длинеконструктор ExportDatabaseCSVTask в классе ExportDatabaseCSVTask не может быть применен к данным типам;new ExportDatabaseCSVTask (). execute ("");^ обязательно: контекст найден: аргументов нетпричина: фактические и формальные списки аргументов различаются по длине

1 Ответ

0 голосов
/ 02 марта 2019

Ваш контекст всегда будет нулевым, потому что он не инициализирован.Инициализация контекста с помощью конструктора

private Context context;

public ExportDatabaseCSVTask(Context context) {
    this.context = context;
}

Это пример вызова после добавления конструктора:

new ExportDatabaseCSVTask(this)

Также будьте осторожны с передачей контекста внутри класса ExportDatabaseCSVTask, лучше оберните контекст через WeakReference.

...