[抱歉英语不好]
大家好, 在这里,我试图在异步任务中做某事,并且应用程序在运行时崩溃。当到达返回行时,应用程序死亡。
这是我的代码
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
方法,但没有解决问题。
答案 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();