1

6 つの異なるアクティビティのボタンがあります。そのボタンをクリックすると、アクティビティに応じて異なるパラメーターでほぼ同じタスクが実行されます。

これは を使用して行わAsyncTaskonPostExecute()、ボタンの状態が変更されます。

someButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        new Task().execute("param1", "param2");
    }
}

private class Task extends AsyncTask<String, Void, String> {

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

        //background task using params[0], params[1]
        return "success" or "error";
    }

    @Override
    protected void onPostExecute(String result) {

        if (result == "success") {
            //change the someButton state
        }else{
            //show an error message
        }
}

6 つのすべてのアクティビティで同じ AsyncTask を使用する代わりに、すべてのアクティビティから単一の Asynctask を使用して、それぞれのビューを変更するにはどうすればよいですか?

4

2 に答える 2

1

メソッド onSuccess、onFailure を使用してタスクを作成し、それらをオーバーライドする必要があります。

public class Task extends AsyncTask<String, Void, String> {

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

        //background task using params[0], params[1]
        return "success" or "error";
    }

    @Override
    protected void onPostExecute(String result) {

        if (result == "success") {
            onSuccess(result);
        }else{
            onFailure(result);
        }
    }

    protected void onSuccess(String result) {};
    protected void onFailure(String result) {};
}

そして、アクティビティでは次のように使用します。

someButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        new Task(){
            @Override
            protected void onSuccess(String result){
                // do what you want
            }
            @Override
            protected void onFailure(String result){
                // do what you want
            }
        }.execute("param1", "param2");
    }
}
于 2013-05-10T07:27:10.180 に答える
1

あなたTask自身のファイルに入れて公開してください。

コールバック インターフェイスを作成します。

public interface TaskCallback {
    public void onSuccess(String result);
    public void onFailure(String errorMessage);
}

そのようなコールバックをあなたに与えますTask:

public class Task extends AsyncTask<String, Void, String> {
    private TaskCallback callback; 

    public Task(TaskCallback callback) {
        this.callback = callback;
    }

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

        //background task using params[0], params[1]
        return "success" or "error";
    }

    @Override
    protected void onPostExecute(String result) {
        if (result == "success") {
            callback.onSuccess(result);
        } else{
            callback.onFailure(errorMessage);
        }
    }
}

Task次に、アクティビティでインスタンスを作成するときにコールバックを実装します。

someButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        private TaskCallback callback = new TaskCallback() {
            @Override
            public void onSuccess(String result) {
                //change the someButton state
            }
            @Override
            public void onFailure(String errorMessage) {
                //show an error message
            }
        }
        new Task(callback).execute("param1", "param2");
    }
}
于 2013-05-10T07:24:36.547 に答える