android - 导出到 CSV 时进度对话框出现 NullPointerException - Android
问题描述
无论我如何修改预执行类或 ProgressBar 的声明,我都会在上下文中得到空指针异常。我已经尝试了几种其他人实施的解决方案来修复错误,但没有任何效果。
我的应用程序应在 CatalogActivity 中单击按钮后导出 CSV。
已经花了几天时间......非常感谢您的帮助。
目录活动:
@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("");
}
导出数据库CSV任务:
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"));
}
日志猫:
2019-03-02 21:05:16.109 7122-7122/com.example.android.name E/AndroidRuntime:致命异常:主进程:com.example.android.stockpile,PID:7122 java.lang.NullPointerException:尝试在 android.app.AlertDialog 的 android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:224) 的空对象引用上调用虚拟方法 'android.content.res.Resources$Theme android.content.Context.getTheme()'。 (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.android。stockpile.CatalogActivity.onOptionsItemSelected(CatalogActivity.java:199) at android.app.Activity.onMenuItemSelected(Activity.java:3435) at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:436) at android.support .v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:196) 在 android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109) 在 android.support.v7.app.AppCompatDelegateImpl.onMenuItemSelected(AppCompatDelegateImpl.java :888) 在 android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158) 上的 android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)。 v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991) 在 android.support.v7。view.menu.MenuBuilder.performItemAction(MenuBuilder.java:981) 在 android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:625) 在 android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView. java:151) at android.view.View.performClick(View.java:6256) at android.view.View$PerformClick.run(View.java:24701) at android.os.Handler.handleCallback(Handler.java:789 ) 在 android.os.Handler.dispatchMessage(Handler.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 不能应用于给定类型;新的 ExportDatabaseCSVTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); ^ 必需:找到上下文:无参数原因:实际参数列表和正式参数列表的长度不同 F:\Android projects\Stockpile\app\src\main\java\com\example\android\stockpile\CatalogActivity.java:203:错误:类 ExportDatabaseCSVTask 中的构造函数 ExportDatabaseCSVTask 不能应用于给定类型;新的 ExportDatabaseCSVTask().execute(""); ^ 必需:找到上下文:无参数原因:实际参数列表和形式参数列表的长度不同
解决方案
您的上下文将始终为空,因为他没有初始化。通过构造函数初始化上下文
private Context context;
public ExportDatabaseCSVTask(Context context) {
this.context = context;
}
这是一个如何在添加构造函数后调用的示例:
new ExportDatabaseCSVTask(this)
还要小心在 ExportDatabaseCSVTask 类中传递上下文,通过 WeakReference 更好地包装上下文。
推荐阅读
- reactjs - 电子中的谷歌“登录”SDK
- ios - Interface Builder 找不到在自定义视图中定义的 intrinsicContentSize
- laravel - 将 id 从 Laravel api 传递到 Select2 脚本的问题
- reactjs - 在firefox中监听文件上传的取消事件
- php - SQL 连接两个表?选择名称类别 - CodeiGniter3
- ruby-on-rails-3 - 如何使用 rails link_tag 和远程打开引导模式:true
- ssas - MDX:返回 Power BI 中选定项目的最后一个值
- java - 如何在 Java 中的“int”数组中存储“”(空格)
- c# - 同时将标头重定向和发布到另一个应用程序 - ASP.Net MVC
- azure - 如何在不禁用许可证的情况下限制用户访问 office365 中的 OneDrive 帐户?