[抱歉英语不好]
大家好,在这里,我试图在异步任务中做一些事情,但应用程序在运行时崩溃。当它到达返回行时,应用程序就会死亡。
这是我的代码
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();