从AsyncTask doInBackground返回的应用程序崩溃

时间:2018-07-11 04:51:58

标签: android android-asynctask

[抱歉英语不好]

大家好, 在这里,我试图在异步任务中做某事,并且应用程序在运行时崩溃。当到达返回行时,应用程序死亡。

这是我的代码

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params){
        velocidadMedia = (distanciaTotal)/(tiempoTotal);
        track = new TrackItem(  sdf.format(new Date()),
                Double.toString((int) distanciaTotal),
                Double.toString((int) tiempoTotal),
                Double.toString((int) velocidadMedia));
        String IDFromServer = databaseReference.push().getKey();
        track.setKey(IDFromServer);
        databaseReference.child(IDFromServer).setValue(track);
        Toast.makeText(getContext(),"Track Creado!", Toast.LENGTH_LONG).show();
        return null;
    }

}

了解此异步任务位于片段内部可能会很有用。

Android Studio在错误日志中向我提供了此信息:

  

由于:java.lang.RuntimeException:无法在内部创建处理程序   没有调用Looper.prepare()

的线程

我尝试使用没有说明的onPostExecute方法,但没有解决问题。

3 个答案:

答案 0 :(得分:4)

您无法从后台线程调用Toast.makeText()。您只能从UI / Main线程调用。将Toast.makeText()呼叫移至onPostExecute()

答案 1 :(得分:1)

来自:Can't create handler inside thread that has not called Looper.prepare()

您正在从辅助线程中调用它。您需要从主线程中调用Toast.makeText()(以及其他大多数处理UI的函数)。例如,您可以使用处理程序。

在文档中查找与UI线程进行通信。简而言之:

// Set this up in the UI thread.

mHandler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message message) {
        // This is where you do your work in the UI thread.
        // Your worker tells you in the message what to do.
    }
};

void workerThread() {
    // And this is how you call it from the worker thread:
    Message message = mHandler.obtainMessage(command, parameter);
    message.sendToTarget();
}

其他选项:

您可以使用AsyncTask,它对于在后台运行的大多数情况都适用。您可以调用它的钩子来指示进度以及完成的时间。

您也可以使用Activity.runOnUiThread()

答案 2 :(得分:0)

您无法在doInBackground()中显示烤面包消息

Toast.makeText(getContext(),"Track Creado!", Toast.LENGTH_LONG).show();