0

私はアプリを持っています。ユーザーがアプリを起動するたびに、データベースに新しいエントリが作成されます。また、ユーザーが終了したときにユーザーのレジストリを削除する機能が必要です。これらの 2 つの関数には、2 つの asynctasks があります。最初のものは正常に機能しており、データベースにユーザーが作成されます。ただし、エラーはありませんが、ユーザーを削除する必要がある asynctask は、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 はその仕事をしています (バックグラウンドで動作しています)。ANRUI でバックグラウンド処理を行っていないため、何もありません。AsyncTask の完了後に UI のビューを更新すると、NULLPOINTER Exception. しかし、これは で AsyncTask を実行するのは良い考えではありませんonDestroy()

代わりにayntask を使用しonDestroy()て、IntentService を拡張するアクティビティを作成し、onDestroy からそのアクティビティを呼び出すことができます

于 2013-06-25T10:54:05.100 に答える