我的应用程序在OnPostExecute ToastOnPostExecute

我试图把context insted的的MainActivity()的上下文中烤面包,但它抛出同样的异常

例外是

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.res.Resources android.content.Context.getResources()”

怎么了? 我该如何解决?

我打电话此AsyncTaskonPostExecute另一个AsyncTask

 InsertInDateDb( MainActivity(), dateEntity).execute()

AsyncTask 在MainActivity

private class InsertInDateDb(var context: MainActivity, var dateEntity: DateEntity) :
    AsyncTask<Void, Void, Boolean>() {
    override fun doInBackground(vararg p0: Void?): Boolean {
        val dateRoomDatabase: DateRoomDatabase = DateRoomDatabase.getDateDb(context)!!

        val dateEntity1 = dateEntity
        dateRoomDatabase!!.getDateDao().insertDate(dateEntity)
        return true
    }

    override fun onPostExecute(result: Boolean?) {
        if (result!!) {

            try {
                Toast.makeText(
                   MainActivity(),
                    "Entry added to date database",
                    Toast.LENGTH_LONG
                ).show()
            } catch (e: Exception) {
                Log.d("tag", "Exception $e")
            }


        }
    }
}

#1楼 票数:2

MainActivity()为您提供MainActivity新实例,这是不MainActivity当前运行情况

您应该改用this@MainActivityapplicationContext

1. Toast.makeText(this@MainActivity, "Entry added to date database", Toast.LENGTH_LONG).show()

2. Toast.makeText(applicationContext, "Entry added to date database", Toast.LENGTH_LONG).show()

#2楼 票数:1

用上下文替换 MainActivity()

Toast.makeText(context, "Entry added to date database", Toast.LENGTH_LONG).show()

#3楼 票数:1

我强烈建议使用观察者模式从 AsyncTask 向活动发送信息。

它简单、安全且优雅。 这是一个示例。

class WriteToDiskAsync(private val writeToDiskListener: WriteToDiskListener) : AsyncTask<Void, Void, File?>() {

    override fun doInBackground(vararg params: Void?): File? {
        //whatever
    }

    override fun onPostExecute(survey: File?) {
        writeToDiskListener.writeToDiskFinished()
    }
}

这是界面:

interface WriteToDiskListener {

    fun writeToDiskFinished()
}

以及活动或片段:

class MainActivity : AppCompatActivity(), WriteToDiskListener {
    //Your stuff...

    override fun writeToDiskFinished() {
        if (!isFinishing) {
            Toast.makeText(this@MainActivity, "Entry added to date database", Toast.LENGTH_LONG).show()
        }
    }
}

建议使用“!isFinishing”检查以避免在某些时刻出现异常。

要从 MainActivity 调用 AsyncTask,您只需执行以下操作:

WriteToDiskAsync(this).execute()

希望能帮助到你。

毛里西奥

#4楼 票数:1

错误似乎是将上下文传递给 InsertInDateDb 实例。

如果此任务嵌入在另一个任务中,则意味着您需要更快地传递上下文(通过传递“this”)或按照 Maurici Guell Hernandez 的回答中的建议,使用接口,将诸如“OnFinishedListener”之类的内容传递给您的 AsyncTasks .

您将在开始时(例如在 MainActivity 中)创建 OnFinishedListener,使用“onFinished”方法,您可以在其中 Toast。 然后分别将侦听器传递给 AsyncTasks,最后在 postExecute 中调用“onFinished”方法,以运行它/使其显示 Toast :)

尽量记住,上下文需要是实际运行的活动(“this”)的实例,而不是尚未创建的东西。

#5楼 票数:0

在 asysnTask 中使用 mainActivityContext 作为上下文;

var mainActivityContext= null
 override fun onCreate(savedInstanceState: Bundle?) {
mainActivityContext=this
...
..
.
}

#6楼 票数:0

只需像这样调用您的AsynckTask

    InsertInDateDb(this@MainActivity, dateEntity).execute()

并像这样在onPostExecute()敬酒

 Toast.makeText(
            context,
            "Entry added to date database",
            Toast.LENGTH_LONG
        ).show()

#7楼 票数:0

创建您的 Activity 对象,如下所示

 lateinit var mActivity: Activity

现在将您的活动设置为您的活动对象。

mActivity = this@YourActivity

在 Toast 中使用mActivity

Toast.makeText(mActivity, "Entry added to date database", Toast.LENGTH_LONG).show()

  ask by Makarand translate from so

未解决问题?本站智能推荐:

1回复

Kotlin中AsyncTask的子类-无法在onPostExecute中使用主构造函数参数

我在Kotlin中实现了AsyncTask的子类: 问题是-我在此行responseHandler.agentCreationSucceeded()遇到错误: 未解决的参考:responseHandler 我可以通过显式声明一个属性并为其分配在构造函数中传递的参数来使其
1回复

anko doAsync中的onPostExecute

我知道在Anko库中有两种方法可以执行AsyncTask 。 doAsync() doAsyncResult() 我的问题是以上两种方法都有onComplete()方法。 在这两种方法的onComplete() ,都没有像AsyncTask.onPostExecute
3回复
2回复

Kotlin 中的 AsyncTask 使用

我在 Kotlin 中使用 AsyncTask 有问题,我实际上是新手,所以请保持冷静:) 所以这里的问题是,我想在另一个类中使用 onPostExecute() 中的结果值 让我向您展示我的代码,这是我的 Provider.kt 文件中的 ProviderAsync() 类(我只是创建了一个我想
4回复

在 Kotlin 中从 AsyncTask 返回一个值

我正在使用 Room 和 LiveData 制作一个遵循 MVVM 模式的 Android 应用程序,但我需要返回一个表中最后一次插入的 ID,因为用于在 ID 是外键的其他表中添加值,我知道我可以实现这个从 DAO 返回它: 但问题是我需要从插入新条目的 AsyncTask 返回一个值,我尝试
1回复

如何在Kotlin中为AsyncTask添加超时

我是Kotlin的初学者。 我正在使用AsyncTask从API执行JSON数据。 我希望在一段时间后添加超时,以防用户数据连接速度很慢或参差不齐,然后向用户显示一个警告对话框,当有一个按钮时,“抱歉你没有正确的互联网连接”点击关闭应用程序。 这是我的AsyncTask代码:
1回复

在 Kotlin 的 AsyncTask 中启动新活动

我想在 onPostExecute 方法中使用 Kotlin 启动一个活动或从 AsyncTask 刷新当前活动,但我不知道该怎么做。 我试图实现一个接口,但我卡住了。 界面 主类
1回复

使用 Kotlin 显示来自 AsyncTask 的 Toast 消息

关于这个主题已经有很多答案,但我无法让我的工作。 从其中一项活动中,我像这样调用我的 asynctask: 我的异步任务如下所示: 错误显示在 toast 函数中。