/* * Copyright (C) 2010-2013 The SINA WEIBO Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sina.weibo.sdk.openapi; import java.io.ByteArrayOutputStream; import java.io.IOException; import android.os.Handler; import android.os.Message; import com.sina.weibo.sdk.auth.Oauth2AccessToken; import com.sina.weibo.sdk.auth.WeiboParameters; import com.sina.weibo.sdk.exception.WeiboException; import com.sina.weibo.sdk.net.AsyncWeiboRunner; import com.sina.weibo.sdk.net.RequestListener; /** * 微博 OpenAPI 的基类,每个接口类都继承了此抽象类。 * TODO:(To be design...) * * @author SINA * @since 2013-11-05 */ public abstract class AbsOpenAPI { /** 用于转发回调函数的消息 */ private static final int MSG_ON_COMPLETE = 1; private static final int MSG_ON_COMPLETE_FOR_BINARY = 2; private static final int MSG_ON_IOEXCEPTION = 3; private static final int MSG_ON_ERROR = 4; /** 访问微博服务接口的地址 */ protected static final String API_SERVER = "https://api.weibo.com/2"; /** POST 请求方式 */ protected static final String HTTPMETHOD_POST = "POST"; /** GET 请求方式 */ protected static final String HTTPMETHOD_GET = "GET"; /** HTTP 参数 */ protected static final String KEY_ACCESS_TOKEN = "access_token"; /** 当前的 Token */ protected Oauth2AccessToken mAccessToken; /** 异步请求回调接口 */ private RequestListener mRequestListener; /** * 构造函数,使用各个 API 接口提供的服务前必须先获取 Token。 * * @param accesssToken 访问令牌 */ public AbsOpenAPI(Oauth2AccessToken accessToken) { mAccessToken = accessToken; } /** * HTTP 异步请求。 * * @param url 请求的地址 * @param params 请求的参数 * @param httpMethod 请求方法 * @param listener 请求后的回调接口 */ protected void request(String url, WeiboParameters params, String httpMethod, RequestListener listener) { mRequestListener = listener; // 异步请求 params.add(KEY_ACCESS_TOKEN, mAccessToken.getToken()); AsyncWeiboRunner.request(url, params, httpMethod, mInternalListener); } /** * 该 Handler 用于将后台线程回调转发到 UI 线程。 */ private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (null == mRequestListener) { return; } switch (msg.what) { case MSG_ON_COMPLETE: mRequestListener.onComplete((String)msg.obj); break; case MSG_ON_COMPLETE_FOR_BINARY: mRequestListener.onComplete4binary((ByteArrayOutputStream)msg.obj); break; case MSG_ON_IOEXCEPTION: mRequestListener.onIOException((IOException)msg.obj); break; case MSG_ON_ERROR: mRequestListener.onError((WeiboException)msg.obj); break; default: break; } } }; /** * 请注意:默认情况下,{@link RequestListener} 对应的回调是运行在后台线程中的, * 因此,需要使用 Handler 来配合更新 UI。 */ private RequestListener mInternalListener = new RequestListener() { @Override public void onComplete(String response) { mHandler.obtainMessage(MSG_ON_COMPLETE, response).sendToTarget(); } @Override public void onComplete4binary(ByteArrayOutputStream responseOS) { mHandler.obtainMessage(MSG_ON_COMPLETE_FOR_BINARY, responseOS).sendToTarget(); } @Override public void onIOException(IOException e) { mHandler.obtainMessage(MSG_ON_IOEXCEPTION, e).sendToTarget(); } @Override public void onError(WeiboException e) { mHandler.obtainMessage(MSG_ON_ERROR, e).sendToTarget(); } }; }