android - 使用回调接口(interface)实现 AsyncTask - 在单个回调接口(interface)中处理多个调用响应

标签 android android-asynctask

在我的 Android 应用程序中,我从一个 Activity 进行多个 API 调用。我正在使用以下方法:在 Activity 中实现接口(interface)并从 Async 类调用该接口(interface)函数。

public interface AsyncResponse {
    public void processFinish(JSONObject sb);
}


public class FetchData extends AsyncTask<String, Integer, JSONObject> {
    HttpURLConnection urlConnection;
    String url;
    String method;
    String payload = null;
    AsyncResponse delegate = null;

    public FetchData(AsyncResponse delegate, String url, String method) {
        this.delegate = delegate;
        this.url = url;
        this.method = method;
    }

    public FetchData(AsyncResponse delegate, String url, String method, JSONObject payload) {
        this(delegate, url, method);
        this.payload = payload.toString();
    }

    @Override
    protected JSONObject doInBackground(String... args) {
        BufferedReader reader = null;

        try {
            URL url = new URL(this.url);

            // Open HTTP connection
            urlConnection = (HttpURLConnection) url.openConnection();

            // HTTP method GET/POST/PUT/DELETE
            urlConnection.setRequestMethod(this.method); 

            // handle issues
            int statusCode = urlConnection.getResponseCode();

            // Get the response
            InputStream inputStream = urlConnection.getInputStream();
            if(inputStream == null) {
                // Nothing to do
                return null;
            }
            reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            String inputLine = null;
            StringBuffer response = new StringBuffer();

            while ((inputLine = reader.readLine()) != null) {
                response.append(inputLine + "\n");
            }

            return new JSONObject(response.toString());
        } catch(Exception e) {
            try {
                // Return error response
            } catch(Exception e1) {
                System.out.println(e1);
                return null;
            }
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (final IOException e) {
                    Log.e("PlaceholderFragment", "Error closing stream", e);
                }
            }
        }
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        this.delegate.processFinish(result);
    }
}


public class AsyncTasks extends AppCompatActivity implements AsyncResponse {
    TextView view = null;
    int a = 1;
    Utility utility = Utility.getInstance();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async_tasks);
        new FetchData(this, "<url 1>", "GET").executeOnExecutor(THREAD_POOL_EXECUTOR);

        new FetchData(this, "<url 2>", "GET").executeOnExecutor(THREAD_POOL_EXECUTOR);
    }

    @Override
    public void processFinish(JSONObject data) {
        utility.showDialog(this, data.toString());
    }
}

这里如何处理processFinish()接口(interface)函数中第二个GET调用的响应?最好的方法是什么?

最佳答案

public interface AsyncResponse {
    //Add requestCode to identify request.  
    public void processFinish(JSONObject sb, int requestCode);
}


public class FetchData extends AsyncTask<String, Integer, JSONObject> {
    HttpURLConnection urlConnection;
    String url;
    String method;
    String payload = null;
    AsyncResponse delegate = null;
    int requestCode;

    public FetchData(String url, String method) {
        this(url, method, null);
    }

    public FetchData(String url, String method, JSONObject payload) {
        this.url = url;
        this.method = method;
        if(payload!=null){
             this.payload = payload.toString();
        }
    }

    //You can set AsyncResponse and RequestCode in constructor also.
    public FetchData setListener(AsyncResponse asyncResponse, int requestCode){
        this.delegate = asyncResponse;
        this.requestCode = requestCode;
        return this;
    }

    @Override
    protected JSONObject doInBackground(String... args) {
        ....
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        if(delegate!=null){        
            //post result with given requestCode
            this.delegate.processFinish(result, requestCode);
        }
    }
}


public class AsyncTasks extends AppCompatActivity implements AsyncResponse {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async_tasks);

        // Make first call with request code as 1    
        new FetchData("<url 1>", "GET").setListener(this, 1).executeOnExecutor(THREAD_POOL_EXECUTOR);

        // Make second call with request code as 2
        new FetchData("<url 2>", "GET").setListener(this, 2).executeOnExecutor(THREAD_POOL_EXECUTOR);
    }

    @Override
    public void processFinish(JSONObject data, int requestCode) {
        switch(requestCode){
            case 1:
            //perform task on 1st call finish
            break;
            case 2:
            utility.showDialog(this, data.toString());
            //perform task on 2nd call finish
            break;
        }
    }
}

关于android - 使用回调接口(interface)实现 AsyncTask - 在单个回调接口(interface)中处理多个调用响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41673318/

相关文章:

java - 自定义Edittext输入文本后隐藏pin栏

android - Perf 无法在 Android 上正确显示调用图

java - 监控 BufferedInputStream 下载进度

java - 无法从静态方法调用 AsyncTask?

android - 从 Listactivity 到 Listfragment

java - Android 项目 - RuntimeException ,由 Null Pointer Exception 引起

android - 连接到 AND UA651BLE 时获取状态为 133 的 Type_Gatt_Error

java - 构建失败,缺少关键属性(Android SDK)

android - 使用 AsyncTask 的服务每 X 次执行一次请求

Android:操作栏中的动画不适用于异步任务