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



[抱歉英语不好]

大家好,在这里,我试图在异步任务中做一些事情,但应用程序在运行时崩溃。当它到达返回行时,应用程序就会死亡。

这是我的代码

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工作室在错误日志中给了我这个:

原因:java.lang.RuntimeException:无法在内部创建处理程序未调用Looper.prepare((的线程

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

您不能从后台线程调用Toast.makeText()。您只能从UI/Main线程进行调用。将Toast.makeText()调用移动到onPostExecute()

来自:Can';t在未调用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()

您不能在doInBackground()中显示toast消息

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

相关内容

  • 没有找到相关文章

最新更新