0

我有一个应用程序,每当用户启动该应用程序时,它都会在数据库中创建一个新条目。此外,应该有一个功能,当用户退出时,删除用户的注册表。对于这 2 个功能,我有 2 个异步任务。第一个工作正常,它在数据库中创建用户。然而,虽然没有错误,但应该删除用户的异步任务在调用 onDestroy() 时什么也不做。我已经使用 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");



        }

    }

感谢您的帮助

4

1 回答 1

1

您的 Activity 被破坏,但 AsyncTask 正在完成它的工作(在后台工作)。不会有ANR,因为您没有在 UI 上做任何背景工作。如果您在 AsyncTask 完成后更新 UI 上的任何视图,那么会有一个NULLPOINTER Exception. 但是,在onDestroy().

使用 asyntaskonDestroy()代替,您可以拥有一个扩展 IntentService 的活动并从 onDestroy 调用该活动

于 2013-06-25T10:54:05.100 回答