【问题标题】:Android, AsyncTask not running on onDestroy()Android,AsyncTask 未在 onDestroy() 上运行
【发布时间】:2013-06-19 10:43:23
【问题描述】:

我面临一个问题,当我关闭我的应用程序时,我想停止服务并运行一个方法

新的 sendLogoutDetail().execute(AccountID);

更新我的数据库。我将方法放在 onDestroy() 中,但是当我结束我的应用程序时,Log Cat 充满了很多错误,我的方法根本没有运行。

这是我的 Android 代码:

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();

    String AccountID = null;
    Bundle extras = getIntent().getExtras();

    if (extras != null){
        AccountID = extras.getString("AccountID");
    }
    new sendLogoutDetail().execute(AccountID);
    stopService(new Intent(this,getLocationService.class));
}

private class sendLogoutDetail extends AsyncTask<String, Void, String>
{
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        progressDialog= ProgressDialog.show(LoggedIn.this, "Ending Service","Loading..", true);

    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        HttpPost request = new HttpPost(SERVICE_URI + "/DeleteLoginPool");
        request.setHeader("Accept", "application/json");            
        request.setHeader("Content-type", "application/json");
        JSONStringer getWifiInfo;
        try {
            getWifiInfo = new JSONStringer()
                .object()
                    .key("staffLocate")
                        .object()                               
                            .key("AccountID").value(params[0])
                        .endObject()
                    .endObject();

        StringEntity entity = new StringEntity(getWifiInfo.toString());

        request.setEntity(entity);

        // Send request to WCF service
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpResponse response = httpClient.execute(request);
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        progressDialog.dismiss();
    }
}

还有我的日志猫:

>06-19 18:42:09.626: W/asset(22278): deep redirect failure from 0x01030117 => 0x0a0a0004, defStyleAttr=0x01010084, defStyleRes=0x0103008f, style=0x010302eb
>06-19 18:42:09.626: W/asset(22278): deep redirect failure from 0x01030117 => 0x0a0a0004, defStyleAttr=0x01010084, defStyleRes=0x0103008f, style=0x010302eb
>06-19 18:42:09.688: E/WindowManager(22278): Activity com.example.staffallocatorproject.LoggedIn has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{413f5790 V.E..... R.....I. 0,0-0,0} that was originally added here
>06-19 18:42:09.688: E/WindowManager(22278): android.view.WindowLeaked: Activity com.example.staffallocatorproject.LoggedIn has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{413f5790 V.E..... R.....I. 0,0-0,0} that was originally added here
>06-19 18:42:09.688: E/WindowManager(22278):    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.Dialog.show(Dialog.java:281)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.ProgressDialog.show(ProgressDialog.java:116)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.ProgressDialog.show(ProgressDialog.java:99)
>06-19 18:42:09.688: E/WindowManager(22278):    at com.example.staffallocatorproject.LoggedIn$sendLogoutDetail.onPreExecute(LoggedIn.java:57)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.os.AsyncTask.execute(AsyncTask.java:534)
>06-19 18:42:09.688: E/WindowManager(22278):    at com.example.staffallocatorproject.LoggedIn.onDestroy(LoggedIn.java:45)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.Activity.performDestroy(Activity.java:5391)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1110)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3568)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3599)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.ActivityThread.access$1200(ActivityThread.java:156)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.os.Handler.dispatchMessage(Handler.java:99)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.os.Looper.loop(Looper.java:137)
>06-19 18:42:09.688: E/WindowManager(22278):    at android.app.ActivityThread.main(ActivityThread.java:5233)
>06-19 18:42:09.688: E/WindowManager(22278):    at java.lang.reflect.Method.invokeNative(Native Method)
>06-19 18:42:09.688: E/WindowManager(22278):    at java.lang.reflect.Method.invoke(Method.java:511)
>06-19 18:42:09.688: E/WindowManager(22278):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
>06-19 18:42:09.688: E/WindowManager(22278):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
>06-19 18:42:09.688: E/WindowManager(22278):    at dalvik.system.NativeStart.main(Native Method)
>06-19 18:42:09.719: E/<<myServiceRunner-onDestroy>>(22278): I am dead-3

【问题讨论】:

  • 你为什么把方法放在onDestrory上你能详细说明一下

标签: java android service android-asynctask


【解决方案1】:

问题是当您的Activity 被破坏时,您正在显示ProgressDialog。因此,如果您想在 Activity 被破坏时执行一些后台操作,请不要显示 ProgressDialog。所以,在那种情况下,AsyncTask 和只有 doInBackground() 应该适合你。

【讨论】:

    【解决方案2】:

    当 Activity 被销毁时,你不能显示任何对话框。

    您可以做的是覆盖 onBackPressed (以及您调用的任何地方 finish() ),并在那里显示您需要的内容,当它完成您希望它做的任何事情时,完成活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 2012-02-25
      • 2019-02-08
      • 2012-08-14
      • 1970-01-01
      • 2020-12-30
      • 2017-07-01
      相关资源
      最近更新 更多