AsyncTask似乎没有真正的异步

时间:2012-03-28 15:41:37

标签: android service android-asynctask progressdialog

我正在调用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;
    }    

}

3 个答案:

答案 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()做了太多工作。

  

等待返回已停止服务的服务和命令未在UI线程中运行。

在主应用程序线程(a.k.a。,&#34; UI-thread&#34;)上调用

onDestroy()


根据第一条评论

更新

  

当我在服务中调用onDestroy()时

从不致电onDestroy()。 Android调用onDestroy()。你不是Android。

  

onDestroy()不是在服务本身的服务中调用,而是在主线程中调用?

您似乎认为服务是一个主题。它不是。您可以通过阅读the documentation(&#34;请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。&#34;)来说明这一点。请阅读文档。