Android:调用onDestroy时Asynctask无法正常工作

时间:2013-06-25 10:47:39

标签: android android-asynctask ondestroy

我有一个应用程序,每当用户启动应用程序时,它都会在数据库中创建一个新条目。此外,应该有一个函数在用户退出时删除用户的注册表。对于这两个函数,我有2个asynctasks。第一个工作正常,它在数据库中创建用户。但是,虽然没有错误,但是当调用onDestroy()时,应删除用户的asynctask不执行任何操作。我已经使用onPause()进行了测试,应用删除了用户,但我不知道为什么不能使用onDestroy()。 这是我使用的相关代码:

 public class Titulacion extends Activity {

    @Override
public void onDestroy(){
super.onDestroy();
new Borrar().execute();
//  UIHelper.killApp(true);
    }

    public static int titulacion;
    Button bAceptar;
    RadioGroup radGrp;
    RadioButton radBot1;
    RadioButton radBot2;
    RadioButton radBot3;
    RadioButton radBot4;
    ImageButton bAdmin;
    static int nTest = 0;
    private ProgressDialog pDialog;
    private static final String TAG_SUCCESS = "success";
    JSONParser jsonParser = new JSONParser();
    private static final int DIALOG_CONFIRMAR_USUARIO = 0;
    int level = -1;
    String levelstring;
    int pid;
    static String pids;
    BroadcastReceiver batteryReceiver;
    String url = "10.0.0.13";
    private static String url_crear = "http://10.0.0.13/subida/create_candidato.php";
    private static final String url_delete = "http://10.0.0.13/subida/delete_candidato.php";

    @SuppressLint("NewApi")
    static String device_id = Build.SERIAL;
    static String PDA = device_id.substring(device_id.length() - 6);


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.titulacion);
        batteryReceiver = new BroadcastReceiver() {
            int scale = -1;
            int voltage = -1;
            int temp = -1;
            @Override
            public void onReceive(Context context, Intent intent) {
                level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                levelstring = String.valueOf(level)+"%";
                scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
                voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
            }
        };
        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryReceiver, filter);




        radGrp = (RadioGroup) findViewById(R.id.titGroup);
        radBot1 = (RadioButton) findViewById(R.id.bot_superior);
        radBot2 = (RadioButton) findViewById(R.id.bot_medio);
        radBot3 = (RadioButton) findViewById(R.id.bot_tecnico);
        radBot4 = (RadioButton) findViewById(R.id.bot_administrativo);
        bAdmin = (ImageButton) findViewById(R.id.administradorinit);
        bAceptar = (Button) findViewById(R.id.BtnAceptar);
        StrictMode.ThreadPolicy policy = new StrictMode. ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

        boolean isReachable = false;
        try{
            isReachable = InetAddress.getByName("10.0.0.13").isReachable(1000);
        } catch (Exception e){
            Log.e("InetAddress", e.getMessage());




        }finally {
            if (isReachable) {
                new CreateCandidato().execute();


            }else{
                Toast.makeText(getApplicationContext(), R.string.errorserver, Toast.LENGTH_LONG).show();
            }

        }


        bAceptar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (radBot1.isChecked()) {
                    titulacion = 1;
                    Intent i = new Intent(Titulacion.this, Ident.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                } else if (radBot2.isChecked()) {
                    titulacion = 2;
                    Intent i = new Intent(Titulacion.this, Ident.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                }

                else if (radBot3.isChecked()) {

                    titulacion = 3;
                    Intent i = new Intent(Titulacion.this, MenuInterna.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                }

                else if (radBot4.isChecked()) {
                    titulacion = 4;
                    Intent i = new Intent(Titulacion.this, MenuSup.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                }
            }
        });
        bAdmin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Titulacion.this, Admin.class);
                startActivity(i);
                unregisterReceiver(batteryReceiver);

            }
        });
    }
    class CreateCandidato extends AsyncTask<String, String, String> {


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Titulacion.this);
            pDialog.setMessage("Actualizando ..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }


        protected String doInBackground(String... args) {

            try {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("nserie", PDA));
            params.add(new BasicNameValuePair("bateria", levelstring));


            JSONObject json = jsonParser.makeHttpRequest(url_crear,
                    "POST", params);

            Log.d("Create Response", json.toString());



                pid = json.getInt("id");
                pids = String.valueOf(pid);


                int success = json.getInt(TAG_SUCCESS);


            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();


        }

    }
    class Borrar extends AsyncTask<String, String, String> {


        @Override
        protected void onPreExecute() {

        super.onPreExecute();
        Log.d("LLEGA1", "LLEGA1");

    }


        protected String doInBackground(String... args) {

            // Check for success tag
            int success;
            try {

            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {


                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("id", Titulacion.getPID()));


                JSONObject json = jsonParser.makeHttpRequest(
                        url_delete, "POST", params);


                Log.d("Delete Product", json.toString());

                success = json.getInt("success");

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }


        protected void onPostExecute(String file_url) {
            Log.d("llega", "LLEGA");



        }

    }

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您的活动被破坏,但AsyncTask正在完成其工作(在后台工作)。不会有任何ANR,因为您没有在UI上执行任何后台操作。如果您在AsyncTask完成后更新UI上的任何视图,那么会有NULLPOINTER Exception。但是,在onDestroy()中运行AsyncTask不是一个好主意。

onDestroy()中使用asyntask而不是你可以有一个扩展IntentService的活动,并从onDestroy中调用该活动