-3

何らかの理由で、私の呼び出しはAsyncTask.cancel一度だけ、つまりタスクの最初のインスタンスに対してのみ機能し、二度と機能しません。最初のタスクが見事にキャンセルされ、メソッドにヒットしonCancelledます。cancel()他のすべての人は呼び出しを無視し、 onPostExecute.

タスクはサービスから実行されます。

public class ZitFtpService extends Service implements ZitFtpServiceInterface
{
//Blah blah

public void connect(String server, int port)
{
    if(!isConnecting){
        isConnecting = true;
        ConnectTask task = new ConnectTask();
        task.execute(server, String.valueOf(port));
    }
    }
    //Blah blah blah

ご覧のとおり、毎回新しいインスタンスです。最初のものが後続のものと異なる動作をする理由がわかりません。はAsyncTaskプライベートな内部クラスです:

private class ConnectTask extends AsyncTask<String, String, Boolean> {

    @Override
    protected Boolean doInBackground(String... params) {

        boolean result = false;

        try {
            publishProgress(
                    "start", "Connecting to "+ params[0] + ":" + params[1]);
            Log.v("ZIT", params[0] + " " + params[1] + " " + params.length);
            conn.connect(params[0], Integer.valueOf(params[1]), 1000);
            result = true;
            } catch (NumberFormatException e) {
            Log.e("ZIT", e.getMessage());
        } catch (IOException e) {
                failMessage = e.getMessage();
                e.printStackTrace();
            } 
        return Boolean.valueOf(result);
    }

    private void cancelConnect()  {
        try {
            conn.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            conn = new ZMobileFTPImpl();
        }

        if(!(dialog==null)) {
            dialog.dismiss();
        }
    }

    @Override
    protected void onCancelled() {
        Log.v("ZIT", "I was cancelled.");
        isConnecting = false;
    } 

    @Override
    protected void onProgressUpdate(String... values) {

        if(dialog == null) {
            dialog = new ProgressDialog(progressActivity);
            dialog.setCancelable(true);
            dialog.setOnCancelListener(new OnCancelListener() {

                @Override
                public void onCancel(DialogInterface dialog) {
                    ConnectTask.this.cancel(true);
                    cancelConnect();
                    dialog.dismiss();

                }
            });
            dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", 
                    new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
        }

        dialog.setMessage(values[1]);
        dialog.setCancelable(true);
        dialog.show();  
    }

    @Override
    protected void onPostExecute(Boolean result) {

        dialog.dismiss();
        if(!result) {
            AlertDialog.Builder builder = 
                    new AlertDialog.Builder(progressActivity);
            builder.setMessage(failMessage).setTitle("Error");
            failMessage = "";
            builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       dialog.dismiss();
                   }
               });
            AlertDialog failDialog = builder.create();
            failDialog.show();
        }

        isConnecting = false;
    }
}
4

2 に答える 2