我正在调用AsyncTask来停止以前启动的服务。 但是当Asyctask运行时,ProgressDialog不会旋转。 所以我认为有一些问题,我可能会遇到ANR错误的问题。
有什么想法吗?
new asyncTaskZieladresse().execute();
public class asyncTaskZieladresse extends AsyncTask<Void, Integer, Void> {
int progress;
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
final Spinner Fahrerauswahl = (Spinner)findViewById(R.id.spinner1);
final Spinner Fahrzeugauswahl = (Spinner)findViewById(R.id.spinner2);
final Spinner Nutzungsartauswahl = (Spinner)findViewById(R.id.spinner3);
Cursor mcursor = (Cursor) Fahrerauswahl.getSelectedItem();
Fahrer = mcursor.getString(mcursor.getColumnIndexOrThrow("name"));
FahrerID = mcursor.getString(mcursor.getColumnIndexOrThrow("_id"));
mcursor.close();
Cursor mcursor1 = (Cursor) Fahrzeugauswahl.getSelectedItem();
Kennzeichen = mcursor1.getString(mcursor1.getColumnIndexOrThrow("fahrzeug_kennzeichen"));
KennzeichenID = mcursor1.getString(mcursor1.getColumnIndexOrThrow("_id"));
mcursor1.close();
Cursor mcursor2 = (Cursor) Nutzungsartauswahl.getSelectedItem();
Nutzungsart = mcursor2.getString(mcursor2.getColumnIndexOrThrow("nutzungsart"));
NutzungsartID = mcursor2.getString(mcursor2.getColumnIndexOrThrow("_id"));
mcursor2.close();
VariablenUebergebenGpsFahrt();
progressDialog.dismiss();
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
progressDialog = ProgressDialog.show(Main.this, "GPS", "Ziel-Standort wird ermittelt...");
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
}
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
stopService(new Intent(Main.this, GPSService.class));
return null;
}
}
答案 0 :(得分:1)
很难理解ANR的原因,但似乎你在onPostExecute()
执行的很多东西都可以移到doInBackground()
上。 Android开发人员建议以asyn方式执行sql lite操作(Content Provider)和每个重量级操作。
答案 1 :(得分:1)
onPostExecute中的所有代码都将在UI线程上执行,只有doInBackground中的代码才会在后台完成......
答案 2 :(得分:1)
这就是我试图用AsyncTask停止服务的原因。
这无济于事,因为我试图在你的问题的评论中解释。如果onDestroy()
花费的时间过长,则需要在后台线程中尽快完成这项工作。将stopService()
调用放在后台线程中是完全没有意义的。
服务本身已在后台运行,而不是在UI线程中运行。
不,不是。
在主应用程序线程上调用 onDestroy()
。 始终强>
您的服务可能还拥有自己的后台主题用于其他工作,但生命周期方法(onCreate()
,onStartCommand()
,onBind()
和{ {1}})总是在主应用程序线程上调用。
因此,如果停止服务需要很长时间,为什么应用程序会挂起?
因为你在onDestroy()
做了太多工作。
在主应用程序线程(a.k.a。,&#34; UI-thread&#34;)上调用等待返回已停止服务的服务和命令未在UI线程中运行。
onDestroy()
。
更新:
当我在服务中调用onDestroy()时
您从不致电onDestroy()
。 Android调用onDestroy()
。你不是Android。
onDestroy()不是在服务本身的服务中调用,而是在主线程中调用?
您似乎认为服务是一个主题。它不是。您可以通过阅读the documentation(&#34;请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。&#34;)来说明这一点。请阅读文档。