android网络主线程异常?

时间:2014-01-28 13:52:01

标签: android

 public class Foursquare {

private static final String LOGIN = "oauth";
public static final String API_END_POING_BASE_URL = "https://api.foursquare.com/v2/";
public static String REDIRECT_URI;
public static final String API_URL = "https://foursquare.com/oauth2/";
//public static final String CANCEL_URI = "";
public static final String TOKEN = "access_token";
public static final String EXPIRES = "expires_in";
public static final String SINGLE_SIGN_ON_DISABLED = "service_disabled";
public static String AUTHENTICATE_URL = "https://foursquare.com/oauth2/authenticate";// +

private String mClientId;
private String mClientSecret;
private String mAccessToken = null;

private DialogListener mAuthDialogListener;

public Foursquare(String clientId, String clientSecret, String redirectUrl) {
    if (clientId == null || clientSecret == null) {
        throw new IllegalArgumentException(
                "You must specify your application ID when instantiating "
                        + "a Foursquare object. See README for details.");
    }
    mClientId = clientId;
    mClientSecret = clientSecret;
    REDIRECT_URI = redirectUrl;
}

public void authorize(Activity activity, final DialogListener listener) {
    mAuthDialogListener = listener;
    startDialogAuth(activity);
}

public void startDialogAuth(Activity activity) {
    CookieSyncManager.createInstance(activity);
    Bundle params = new Bundle();
    dialog(activity, LOGIN, params, new DialogListener() {

        public void onComplete(Bundle values) {
            // ensure any cookies set by the dialog are saved
            CookieSyncManager.getInstance().sync();
            String _token = values.getString(TOKEN);
            setAccessToken(_token);
            // setAccessExpiresIn(values.getString(EXPIRES));
            if (isSessionValid()) {
                Log.d("Foursquare-authorize",
                        "Login Success! access_token=" + getAccessToken());
                mAuthDialogListener.onComplete(values);
            } else {
                mAuthDialogListener.onFoursquareError(new FoursquareError(
                        "Failed to receive access token."));
            }
        }

        public void onError(DialogError error) {
            Log.d("Foursquare-authorize", "Login failed: " + error);
            mAuthDialogListener.onError(error);
        }

        public void onFoursquareError(FoursquareError error) {
            Log.d("Foursquare-authorize", "Login failed: " + error);
            mAuthDialogListener.onFoursquareError(error);
        }

        public void onCancel() {
            Log.d("Foursquare-authorize", "Login canceled");
            mAuthDialogListener.onCancel();
        }
    });
}

public void dialog(Context context, String action, Bundle parameters,
        final DialogListener listener) {

    String endpoint = "";

    parameters.putString("client_id", mClientId);
    parameters.putString("display", "touch");
    if (action.equals(LOGIN)) {
        endpoint = AUTHENTICATE_URL;
        parameters.putString("client_secret", mClientSecret);
        parameters.putString("response_type", "token");
        parameters.putString("redirect_uri", REDIRECT_URI);
    }

    //      if (isSessionValid()) {
    //          parameters.putString(TOKEN, getAccessToken());
    //      }
    String url = endpoint + "?" + Util.encodeUrl(parameters);
    if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
        Util.showAlert(context, "Error",
                "Application requires permission to access the Internet");
    } else {
        new FoursquareDialog(context, url, listener).show();
    }
}

public boolean isSessionValid() {
    if (getAccessToken() != null) {
        return true;
    }
    return false;
}

public void setAccessToken(String token) {
    mAccessToken = token;
}

public String getAccessToken() {
    return mAccessToken;
}

public String request(String graphPath) throws MalformedURLException,
IOException {
    return request(graphPath, new Bundle(), "GET");
}

public String request(String graphPath, Bundle parameters)
        throws MalformedURLException, IOException {
    return request(graphPath, parameters, "GET");
}

public String request(String graphPath, Bundle params, String httpMethod)
        throws FileNotFoundException, MalformedURLException, IOException {
    params.putString("format", "json");
    if (isSessionValid()) {
        params.putString("oauth_token", getAccessToken());
    }
    String url = API_END_POING_BASE_URL + graphPath;
    return Util.openUrl(url, httpMethod, params);
}

public static interface DialogListener {

    /**
     * Called when a dialog completes.
     * 
     * Executed by the thread that initiated the dialog.
     * 
     * @param values
     *            Key-value string pairs extracted from the response.
     */
    public void onComplete(Bundle values);

    /**
     * Called when a Foursquare responds to a dialog with an error.
     * 
     * Executed by the thread that initiated the dialog.
     * 
     */
    public void onFoursquareError(FoursquareError e);

    /**
     * Called when a dialog has an error.
     * 
     * Executed by the thread that initiated the dialog.
     * 
     */
    public void onError(DialogError e);

    /**
     * Called when a dialog is canceled by the user.
     * 
     * Executed by the thread that initiated the dialog.
     * 
     */
    public void onCancel();

}

} 我在我的应用程序中使用foursqure功能,其中用户可以共享任何数据,因此用户可以分享foursqure ..,问题是当我在我的oncreate中使用“StrictMode”功能时,它没有给我错误。但是当我是不使用它给我网络minthread异常  我在foursqure中得到这个例外。当对话框正在加载时 - 我的所作所为请帮助我谢谢... :) 这是我的logcat logcat

2 个答案:

答案 0 :(得分:2)

网络运营往往需要一些时间。这就是为什么在Android上,禁止在UI(前台)线程上执行网络任务。如果您尝试,系统会抛出NetworkingOnMainThreadException

您必须将网络代码移动到后台线程。最简单的方法是使用AsyncTask.

答案 1 :(得分:-1)

实施AsyncTask,阅读here