Commit 865c1493 by ssngah

Add GsonRequest .

parents
# Built application files
*.apk
*.ap_
# Files for the Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# Intellij
*.iml
# Keystore files
*.jks
HuxiLibraries
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<component name="CopyrightManager">
<settings default="" />
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="1.7" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/xgvolleyex" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="SerializableHasSerialVersionUIDField" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoreAnonymousInnerClasses" value="false" />
<option name="superClassString" value="" />
</inspection_tool>
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="animated-vector-drawable-23.2.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/23.2.0/jars/classes.jar!/" />
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/23.2.0/res" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/Library/Android/sdk/extras/android/m2repository/com/android/support/animated-vector-drawable/23.2.0/animated-vector-drawable-23.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="appcompat-v7-23.2.0">
<ANNOTATIONS>
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.2.0/annotations.zip!/" />
</ANNOTATIONS>
<CLASSES>
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.2.0/jars/classes.jar!/" />
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.2.0/res" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/Library/Android/sdk/extras/android/m2repository/com/android/support/appcompat-v7/23.2.0/appcompat-v7-23.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="gson-2.3.1">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.3.1/ecb6e1f8e4b0e84c4b886c2f14a1500caf309757/gson-2.3.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.3.1/563dcb685903c96ce8abbd03adf7fa49e19aa8b4/gson-2.3.1-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="httpclient-android-4.3.5">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient-android/4.3.5/82edcaec6c7b4599eaeaaf11167ceea41db42f33/httpclient-android-4.3.5.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient-android/4.3.5/49354cff4cb9adbfde5202bd0f9075e197ce8ae0/httpclient-android-4.3.5-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="httpmime-4.3.6">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.3.6/cf8bacbf0d476c7f2221f861269365b66447f7ec/httpmime-4.3.6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.3.6/2b5dc16e6104e3341c210ef4113a2fc1b4f2ea5f/httpmime-4.3.6-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="library-1.0.19">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.mcxiaoke.volley/library/1.0.19/a8f23f65fc1e522ee4a1a697ee569901a46741fa/library-1.0.19.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.mcxiaoke.volley/library/1.0.19/2bac9e638b022ca09262960f83e8c9da93d80468/library-1.0.19-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="org.apache.http.legacy-android-23">
<CLASSES>
<root url="jar://$USER_HOME$/Library/Android/sdk/platforms/android-23/optional/org.apache.http.legacy.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="support-annotations-23.2.0">
<CLASSES>
<root url="jar://$USER_HOME$/Library/Android/sdk/extras/android/m2repository/com/android/support/support-annotations/23.2.0/support-annotations-23.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/Library/Android/sdk/extras/android/m2repository/com/android/support/support-annotations/23.2.0/support-annotations-23.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="support-v4-23.2.0">
<ANNOTATIONS>
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.2.0/annotations.zip!/" />
</ANNOTATIONS>
<CLASSES>
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.2.0/jars/classes.jar!/" />
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.2.0/res" />
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.2.0/jars/libs/internal_impl-23.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/Library/Android/sdk/extras/android/m2repository/com/android/support/support-v4/23.2.0/support-v4-23.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="support-vector-drawable-23.2.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/23.2.0/jars/classes.jar!/" />
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/23.2.0/res" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/Library/Android/sdk/extras/android/m2repository/com/android/support/support-vector-drawable/23.2.0/support-vector-drawable-23.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State>
<id />
</State>
</expanded-state>
<selected-state>
<State>
<id>Android</id>
</State>
</selected-state>
</profile-state>
</entry>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/HuxiLibraries.iml" filepath="$PROJECT_DIR$/HuxiLibraries.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/xgvolleyex/xgvolleyex.iml" filepath="$PROJECT_DIR$/xgvolleyex/xgvolleyex.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="" />
</component>
</project>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
apply plugin: 'com.android.application'
//you may want to use android annotation
//apply plugin: 'com.neenbedankt.android-apt'
//
// ext.androidAnnotationsVersion = '3.3.1';
//
//configurations {
// apt
//
//}
//apt {
// arguments {
// resourcePackageName 'com.huxi.huxilibraries'
// androidManifestFile variant.outputs[0].processResources.manifestFile
// }
//}
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.huxi.huxilibraries"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true
}
}
// 屏蔽lint的严格检查
//lintOptions {
//abortOnError false
//}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/lihuan/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
#-keepclassmembers class * implements java.io.Serializable {
# static final long serialVersionUID;
# private static final java.io.ObjectStreamField[] serialPersistentFields;
# private void writeObject(java.io.ObjectOutputStream);
# private void readObject(java.io.ObjectInputStream);
# java.lang.Object writeReplace();
# java.lang.Object readResolve();
#}
#-keep public class * extends android.support.v4.**
#-keepclassmembers class * {
# @android.webkit.JavascriptInterface <methods>;
#}
#-keep public class com.huxi.huxilibraries.R$*{
# public static final int *;
#}
######################gson#######################
#-keep class com.google.gson.JsonObject { *; }
#-keepattributes Signature
#-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.examples.android.model.** { *; }
#-keep class com.google.gson.stream.** { *; }
###################volley############################
#-keep class com.android.volley.** {*;}
#-keep class com.android.volley.toolbox.** {*;}
#-keep class com.android.volley.Response$* { *; }
#-keep class com.android.volley.Request$* { *; }
#-keep class com.android.volley.RequestQueue$* { *; }
#-keep class com.android.volley.toolbox.HurlStack$* { *; }
#-keep class com.android.volley.toolbox.ImageLoader$* { *; }
package com.huxi.huxilibraries;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest package = "com.huxi.huxilibraries"
xmlns:android = "http://schemas.android.com/apk/res/android">
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:supportsRtl = "false"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<category android:name = "android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
package com.huxi.huxilibraries;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:paddingBottom = "@dimen/activity_vertical_margin"
android:paddingLeft = "@dimen/activity_horizontal_margin"
android:paddingRight = "@dimen/activity_horizontal_margin"
android:paddingTop = "@dimen/activity_vertical_margin"
tools:context = "com.huxi.huxilibraries.MainActivity">
<TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Hello World!"/>
</RelativeLayout>
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name = "activity_horizontal_margin">64dp</dimen>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name = "colorPrimary">#3F51B5</color>
<color name = "colorPrimaryDark">#303F9F</color>
<color name = "colorAccent">#FF4081</color>
<color name = "common_txt_color">#585858</color>
</resources>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name = "activity_horizontal_margin">16dp</dimen>
<dimen name = "activity_vertical_margin">16dp</dimen>
</resources>
<resources>
<string name = "app_name">HuxiLibraries</string>
</resources>
<resources>
<!-- Base application theme. -->
<style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name = "colorPrimary">@color/colorPrimary</item>
<item name = "colorPrimaryDark">@color/colorPrimaryDark</item>
<item name = "colorAccent">@color/colorAccent</item>
<item name = "android:textColor">@color/common_txt_color</item>
</style>
</resources>
package com.huxi.huxilibraries;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
ext {
compileSdkVersion = 23
buildToolsVersion = "23.0.1"
minSdkVersion = 14
targetSdkVersion = 23
}
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
\ No newline at end of file
#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
include ':app', ':xgvolleyex'
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
group='com.github.ssngah'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
useLibrary 'org.apache.http.legacy'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.google.code.gson:gson:2.3.1'
// compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
// compile('org.apache.httpcomponents:httpmime:4.3')
// {
// exclude module: "httpclient"
// }
compile('org.apache.httpcomponents:httpmime:4.3.6') {
exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Applications/adt-bundle-mac-x86_64-20140702/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
package com.xiaogu.xgvolleyex;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaogu.xgvolleyex">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application android:allowBackup="true"
android:label="@string/app_name"
>
</application>
</manifest>
package com.xiaogu.xgvolleyex;
import android.content.Context;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.text.TextUtils;
import android.util.Log;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HurlStack;
import com.android.volley.toolbox.Volley;
import com.google.gson.reflect.TypeToken;
import com.xiaogu.xgvolleyex.utils.JsonUtils;
import com.xiaogu.xgvolleyex.utils.NetworkStateReceiver;
import com.xiaogu.xgvolleyex.utils.NetworkUtils;
import org.json.JSONObject;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import javax.xml.transform.ErrorListener;
/**
* An instance for an activity which need to do web request is suggested
* Request will not be performed if the certificate factory can not be created when use the https
* mode
* Created by Phyllis on 15-4-11.
*/
public abstract class BaseWebRequest {
private RequestQueue mQueue;
public static final String TAG = "XG_VOLLEY";
private static RequestQueue mTryBestQueue;
private int mTimeOut = 10 * 1000;
private static List<Request> mSuspendedRequest;
private static boolean mIsRegistered = false;
public BaseWebRequest(Context context) {
mQueue = getRequestQueue(context.getApplicationContext());
}
private void setTimeOut(int timeOut) {
mTimeOut = timeOut;
}
private RequestQueue getRequestQueue(Context context) {
if(isHttpsMode()) {
return createHttpsQueue(context);
} else {
return Volley.newRequestQueue(context);
}
}
private RequestQueue createHttpsQueue(Context context) {
SSLSocketFactory factory = getSSLSocketFactory(context);
HurlStack stack = new HurlStack(null, factory);
return Volley.newRequestQueue(context, stack);
}
private SSLSocketFactory getSSLSocketFactory(Context context) {
int certificateId = getCertificateId();
if(certificateId == 0) {
throw new RuntimeException(
"Id of certificate file not provided.Please override the method " +
"getCertificateId() and return the right id");
}
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
Certificate certificate = certificateFactory
.generateCertificate(context.getResources().openRawResource(certificateId));
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", certificate);
TrustManagerFactory managerFactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
managerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, managerFactory.getTrustManagers(), null);
return sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* default request mode:post
*
* @param params can be an common object(if it is a string ,it should be a string in json
* format) ,a map or a JSONObject;
* @return The request used to request data from web server,you can use the request to
* control the request like cancel it.
*/
protected Request sendRequest(String url, Object params, TypeToken targetType,
OnJobFinishListener listener) {
return sendRequest(Request.Method.POST, url, params, targetType, listener);
}
protected Request sendRequest(int httpMethod, String url, Object params, TypeToken targetType,
OnJobFinishListener listener) {
Request jsonObjectRequest = getRequest(httpMethod, url, params,
targetType, listener
);
mQueue.add(jsonObjectRequest);
Log.d(TAG,"sent request to url:"+url);
return jsonObjectRequest;
}
protected Request sendRequest(int httpMethod, String url, Object params, TypeToken targetType,
OnJobFinishListener listener,
Response.ErrorListener netErrorListener) {
Request jsonObjectRequest = getRequest(httpMethod, url, params,
targetType, listener,
netErrorListener
);
mQueue.add(jsonObjectRequest);
Log.d(TAG, "sent request to url:" + url);
return jsonObjectRequest;
}
/**
* the request will go on and on until it gets response
*
* @param netErrorListener the call back listener when net error happens,null is allowed
* @return The request used to request data from web server
*/
protected Request tryBestToRequest(int httpMethod, String url, Object params,
TypeToken targetType,
Context context,
OnJobFinishListener listener,
Response.ErrorListener netErrorListener) {
tryToReceiveNetworkState(context);
if(mTryBestQueue == null) {
mTryBestQueue = getRequestQueue(context.getApplicationContext());
}
if(netErrorListener == null)
netErrorListener = getDefaultErrorListener(listener);
Request jsonObjectRequest = getRequest(httpMethod, url, params,
targetType, listener,
netErrorListener
);
RetryPolicy policy = new DefaultRetryPolicy(mTimeOut, Integer.MAX_VALUE,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
jsonObjectRequest.setRetryPolicy(policy);
//if the network is not available we just cache the request instead of add to the queue;
if(!NetworkUtils.isNetworkEnable(context)) {
suspendTheRequest(jsonObjectRequest);
return jsonObjectRequest;
}
mTryBestQueue.add(jsonObjectRequest);
Log.d(TAG, "sent request to url:" + url);
return jsonObjectRequest;
}
private void tryToReceiveNetworkState(Context context) {
if(mIsRegistered) {
return;
}
NetworkStateReceiver mReceiver = new NetworkStateReceiver();
context.registerReceiver(mReceiver,
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
mIsRegistered = true;
}
private void suspendTheRequest(Request request) {
if(mSuspendedRequest == null) {
mSuspendedRequest = new ArrayList<>(1);
}
mSuspendedRequest.add(request);
}
private static void restartSuspendedRequest() {
if(mSuspendedRequest == null || mSuspendedRequest.isEmpty())
return;
for(Request request : mSuspendedRequest) {
mTryBestQueue.add(request);
}
mSuspendedRequest.clear();
}
private String getParamsJsonStr(Object params) {
String object = null;
if(params != null) {
if(params instanceof JSONObject || params instanceof String) {
object = params.toString();
return object;
}
String jsonString = JsonUtils.toJson(params);
if(!TextUtils.isEmpty(jsonString)) {
object = jsonString;
}
}
return object;
}
private Request getRequest(int httpMethodName, String url,
Object reqJsonStr,
final TypeToken targetType,
final OnJobFinishListener
listener) {
Response.ErrorListener errorListener = getErrorListener(listener);
if (errorListener == null) {
errorListener = getDefaultErrorListener(listener);
}
return getRequest(httpMethodName, url, reqJsonStr, targetType, listener,
errorListener);
}
protected Response.ErrorListener getErrorListener(final OnJobFinishListener listener) {
return null;
}
private Response.ErrorListener getDefaultErrorListener(
final OnJobFinishListener listener) {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(listener != null) {
listener.onWebCallFinish(false, error);
}
if(!TextUtils.isEmpty(error.getMessage())){
Log.e(TAG, error.getMessage());
}
}
};
}
/**
* You can override this method to return a custom request you need,if you do this ,it is
* your responsibility to init the request parameters like the RetryPolicy and shouldcatch etc.
*
* @param httpMethodName
* @param url
* @param params This can be an object ,if it is a String,then you it should be a
* jsonString
* @param targetType
* @param listener
* @param errorListener
* @return The request will be added to the request queue;
*/
protected Request getRequest(int httpMethodName, String url,
Object params,
final TypeToken targetType,
final OnJobFinishListener listener,
final Response.ErrorListener errorListener) {
String jsonParams = getParamsJsonStr(params);
JsonStringRequest req = new JsonStringRequest(httpMethodName, url,
jsonParams,
getSuccessListener(targetType, listener),
errorListener);
req.setExtraHeaders(getHeaders());
req.setShouldCache(false);
RetryPolicy retryPolicy = new DefaultRetryPolicy(mTimeOut,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
req.setRetryPolicy(retryPolicy);
return req;
}
protected Response.Listener<String> getSuccessListener(final TypeToken targetType,
final OnJobFinishListener listener) {
return new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(listener == null) {
return;
}
if(response == null) {
listener.onWebCallFinish(false,
null);
} else {
Log.d(TAG, response);
Object result;
if(isAutoParseJson()) {
result = JsonUtils
.fromJson(response,
targetType);
if(result == null) {
Class newResult = targetType.getRawType();
try {
result = newResult.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
} else {
result = response;
}
listener.onWebCallFinish(true,
result);
}
}
};
}
public void cancelAllRequest() {
if(mQueue != null) {
RequestQueue.RequestFilter mRequestFilter = new RequestQueue.RequestFilter() {
public boolean apply(Request<?> request) {
return true;
}
};
mQueue.cancelAll(mRequestFilter);
}
}
public static void tryToResumeRequest(Context context) {
if(mTryBestQueue == null)
return;
if(NetworkUtils.isNetworkEnable(context)) {
restartSuspendedRequest();
}
}
/**
* This method should be override if need to set custom headers
*/
protected Map<String, String> getHeaders() {
return null;
}
/**
* This method should be override and return true if need to use https mode
* default value is false;
*/
protected boolean isHttpsMode() {
return false;
}
/**
* Override this method if you need to handle the json string yourself
*
* @return True means the parent class will parse the json for you
*/
protected boolean isAutoParseJson() {
return true;
}
/**
* The certificate should be placed in the folder named "raw"
*
* @return https certificate id
*/
protected int getCertificateId() {
return 0;
}
public interface OnJobFinishListener {
public void onWebCallFinish(boolean isSuccess, Object data);
}
}
package com.xiaogu.xgvolleyex;
import android.content.Context;
import com.android.volley.Request;
import com.android.volley.Response;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;
/**
* Created by Phyllis on 15-5-23.
*/
public abstract class BaseWebUploadImgRequest extends BaseWebRequest {
public BaseWebUploadImgRequest(Context context) {
super(context);
}
@Override
protected Request getRequest(int httpMethodName, String url, Object params,
TypeToken targetType,
OnJobFinishListener listener,
Response.ErrorListener errorListener) {
if(!(params instanceof HashMap)) {
throw new RuntimeException(
"The third parameter should be an instanceof HashMap<String,Object>");
} else {
HashMap<String, Object> maps = (HashMap<String, Object>)params;
return new MultipartRequest(httpMethodName, url, maps,
getSuccessListener(targetType,listener),
errorListener);
}
}
}
package com.xiaogu.xgvolleyex;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.JsonRequest;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
* Created by Phyllis on 15-4-13.
*/
/**
* A request for retrieving a json format string response body at a given URL,
* allowing for an
*
*/
public class JsonStringRequest extends JsonRequest<String> {
private Map<String, String> extraHeaders;
/**
* Creates a new request.
*
* @param method the HTTP method to use
* @param url URL to fetch the JSON from
* @param requestBody A {@link String} to post with the request. Null is allowed and
* indicates no parameters will be posted along with request.
* @param listener Listener to receive the JSON response
* @param errorListener Error listener, or null to ignore errors.
*/
public JsonStringRequest(int method, String url, String requestBody,
Response.Listener<String> listener,
Response.ErrorListener errorListener) {
super(method, url, requestBody, listener,
errorListener);
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers,
PROTOCOL_CHARSET));
return Response.success(jsonString,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
public void setExtraHeaders(Map<String,String> header){
extraHeaders = header;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
if(extraHeaders!=null){
return extraHeaders;
}
return super.getHeaders();
}
}
package com.xiaogu.xgvolleyex;
import android.graphics.Bitmap;
import com.android.volley.Response;
import com.android.volley.VolleyLog;
import org.apache.http.Consts;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.HttpEntity;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Phyllis on 15-5-23.
*/
public class MultipartRequest extends JsonStringRequest {
private MultipartEntityBuilder mEntityBuilder;
private HttpEntity mEntity;
public MultipartProgressListener multipartProgressListener;
private long fileLength = 0L;
public MultipartRequest(int method, String url, HashMap<String, Object> files,
Response.Listener<String> listener,
Response.ErrorListener errorListener,MultipartProgressListener progressListener) {
super(method, url, "", listener, errorListener);
multipartProgressListener = progressListener;
buildMultipartEntity(files);
}
/**
* Creates a new request.
*
* @param method the HTTP method to use
* @param url URL to fetch the JSON from
* @param listener Listener to receive the JSON response
* @param errorListener Error listener, or null to ignore errors.
* @param files The File to post with the request,Null is not allowed.
*/
public MultipartRequest(int method, String url, HashMap<String, Object> files,
Response.Listener<String> listener,
Response.ErrorListener errorListener) {
super(method, url, "", listener, errorListener);
buildMultipartEntity(files);
}
/**
* 注意Map里面的value中,将会使用toString方法来获得值
*
* @param params
*/
private void buildMultipartEntity(HashMap<String, Object> params) {
mEntityBuilder = MultipartEntityBuilder.create();
mEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
ContentType type = ContentType.create("text/plain", Consts.UTF_8);
for(Map.Entry<String, Object> entry : params.entrySet()) {
if(entry.getValue() instanceof File) {
addFile((File)entry.getValue(), entry.getKey());
} else if(entry.getValue() instanceof Bitmap) {
Bitmap bitmap = (Bitmap)entry.getValue();
addBitmap(bitmap, entry.getKey());
} else if(entry.getValue() instanceof List) {
List list = (List)entry.getValue();
int i = 0;
for(Object object : list) {
if(object instanceof File) {
// FileBody fileBody = new FileBody((File)object);
// mEntityBuilder.addPart(entry.getKey() + "[" + String.valueOf(i++) + "]",
// fileBody);
addFile((File)object,entry.getKey());
} else if(object instanceof Bitmap) {
addBitmap((Bitmap)object, entry.getKey());
}
i++;
}
} else {
mEntityBuilder.addTextBody(entry.getKey(), entry.getValue().toString(), type);
}
}
mEntity = mEntityBuilder.build();
}
private void addBitmap(Bitmap bitmap, String key) {
ContentBody body = new ByteArrayBody(getBitmapBytes(bitmap), key + ".jpg");
mEntityBuilder.addPart(key, body);
}
private void addFile(File file, String key) {
FileBody fileBody = new FileBody(file);
mEntityBuilder.addPart(key, fileBody);
}
public static byte[] getBitmapBytes(Bitmap bitmap) {
if(bitmap == null)
return null;
int compressSize = 100;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, compressSize, outputStream);
bitmap.recycle();
return outputStream.toByteArray();
}
@Override
public String getBodyContentType() {
return mEntity.getContentType().getValue();
}
@Override
public byte[] getBody() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
//mEntity.writeTo(bos);
mEntity.writeTo(new CountingOutputStream(bos, mEntity.getContentLength(),
multipartProgressListener));
return bos.toByteArray();
} catch (IOException e) {
VolleyLog.e("IOException writing to ByteArrayOutputStream");
return null;
}
}
public static interface MultipartProgressListener {
void transferred(long transfered, int progress);
}
public static class CountingOutputStream extends FilterOutputStream {
private final MultipartProgressListener progListener;
private long transferred;
private long fileLength;
public CountingOutputStream(final OutputStream out, long fileLength,
final MultipartProgressListener listener) {
super(out);
this.fileLength = fileLength;
this.progListener = listener;
this.transferred = 0;
}
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
if (progListener != null) {
this.transferred += len;
int prog = (int) (transferred * 100 / fileLength);
this.progListener.transferred(this.transferred, prog);
}
}
public void write(int b) throws IOException {
out.write(b);
if (progListener != null) {
this.transferred++;
int prog = (int) (transferred * 100 / fileLength);
this.progListener.transferred(this.transferred, prog);
}
}
}
}
package com.xiaogu.xgvolleyex.utils;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
/**
* 包含操作 {@code JSON} 数据的常用方法的工具类。
* <p />
* 该工具类使用的 {@code JSON} 转换引擎是 <a href="http://code.google.com/p/google-gson/"
* mce_href="http://code.google.com/p/google-gson/" target="_blank">
* {@code Google Gson}</a>。
*
* 下面是工具类的使用案例:
*
* <pre>
* public class User {
* @SerializedName("pwd")
* private String password;
* @Expose
* @SerializedName("uname")
* private String username;
* @Expose
* @Since(1.1)
* private String gender;
* @Expose
* @Since(1.0)
* private String sex;
*
* public User() {}
* public User(String username, String password, String gender) {
* // user constructor code... ... ...
* }
*
* public String getUsername()
* ... ... ...
* }
* List<User> userList = new LinkedList<User>();
* User jack = new User("Jack", "123456", "Male");
* User marry = new User("Marry", "888888", "Female");
* userList.add(jack);
* userList.add(marry);
* Type targetType = new TypeToken<List<User>>(){}.getType();
* String sUserList1 = JSONUtils.toJson(userList, targetType);
* sUserList1 ----> [{"uname":"jack","gender":"Male","sex":"Male"},{"uname":"marry","gender":"Female","sex":"Female"}]
* String sUserList2 = JSONUtils.toJson(userList, targetType, false);
* sUserList2 ----> [{"uname":"jack","pwd":"123456","gender":"Male","sex":"Male"},{"uname":"marry","pwd":"888888","gender":"Female","sex":"Female"}]
* String sUserList3 = JSONUtils.toJson(userList, targetType, 1.0d, true);
* sUserList3 ----> [{"uname":"jack","sex":"Male"},{"uname":"marry","sex":"Female"}]
* </pre>
*
* @since ay-commons-lang 1.0
* @version 1.1.0
*/
public class JsonUtils {
/** 空的 {@code JSON} 数据 - <code>"{}"</code>。 */
public static final String EMPTY_JSON = "{}";
public static final String NULL_JSON = "null";
/** 空的 {@code JSON} 数组(集合)数据 - {@code "[]"}。 */
public static final String EMPTY_JSON_ARRAY = "[]";
public static final String NULL_JSON_ARRAY = "[null]";
/** 默认的 {@code JSON} 日期/时间字段的格式化模式。 */
public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
/** {@code Google Gson} 的 <code>@Since</code> 注解常用的版本号常量 - {@code 1.0}。 */
public static final double SINCE_VERSION_10 = 1.0d;
/** {@code Google Gson} 的 <code>@Since</code> 注解常用的版本号常量 - {@code 1.1}。 */
public static final double SINCE_VERSION_11 = 1.1d;
/** {@code Google Gson} 的 <code>@Since</code> 注解常用的版本号常量 - {@code 1.2}。 */
public static final double SINCE_VERSION_12 = 1.2d;
/** {@code Google Gson} 的 <code>@Until</code> 注解常用的版本号常量 - {@code 1.0}。 */
public static final double UNTIL_VERSION_10 = SINCE_VERSION_10;
/** {@code Google Gson} 的 <code>@Until</code> 注解常用的版本号常量 - {@code 1.1}。 */
public static final double UNTIL_VERSION_11 = SINCE_VERSION_11;
/** {@code Google Gson} 的 <code>@Until</code> 注解常用的版本号常量 - {@code 1.2}。 */
public static final double UNTIL_VERSION_12 = SINCE_VERSION_12;
/**
* <p>
* <code>JSONUtils</code> instances should NOT be constructed in standard
* programming. Instead, the class should be used as
* <code>JSONUtils.fromJson("foo");</code>.
* </p>
* <p>
* This constructor is public to permit tools that require a JavaBean
* instance to operate.
* </p>
*/
public JsonUtils() {
super();
}
public static GsonBuilder builder = new GsonBuilder();
/***
* 判断字符串是否为有内容
*
* @param string
* @return
*/
private static boolean isBlankString(String string) {
if( string == null || "".equals(string) ) {
return true;
} else {
return false;
}
}
/**
* 将给定的目标对象根据指定的条件参数转换成 {@code JSON} 格式的字符串。
* <p />
* <strong>该方法转换发生错误时,不会抛出任何异常。若发生错误时,普通对象返回 <code>"{}"</code>; 集合或数组对象返回
* <code>"[]"</code> </strong>
*
* @param target 目标对象。
* @param targetType 目标对象的类型。
* @param isSerializeNulls 是否序列化 {@code null} 值字段。
* @param version 字段的版本号注解。
* @param datePattern 日期字段的格式化模式。
* @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, Type targetType, boolean isSerializeNulls, Double version, String datePattern, boolean excludesFieldsWithoutExpose) {
if( target == null )
return EMPTY_JSON;
if( isSerializeNulls ) {
builder.serializeNulls();
}
if( version != null ) {
builder.setVersion(version.doubleValue());
}
if( isBlankString(datePattern) ) {
datePattern = DEFAULT_DATE_PATTERN;
}
// builder.setDateFormat(datePattern)
// .registerTypeAdapter(OrderInfoBean.class, orderInfoBeanAdapter)
// .registerTypeAdapter(OffLinePayOrdersInfoBean.class, orderInfoBeanAdapter)
// .registerTypeAdapter(AliPayOrdersInfoBean.class, orderInfoBeanAdapter);
// if (excludesFieldsWithoutExpose){
// builder.excludeFieldsWithoutExposeAnnotation();
// }
return toJson(target, targetType, builder);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean}
* 对象。</strong>
* <ul>
* <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target) {
return toJson(target, null, false, null, null, false);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean}
* 对象。</strong>
* <ul>
* <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param datePattern 日期字段的格式化模式。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, String datePattern) {
return toJson(target, null, false, null, datePattern, true);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean}
* 对象。</strong>
* <ul>
* <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param version 字段的版本号注解({@literal @Since})。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, Double version) {
return toJson(target, null, false, version, null, true);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean}
* 对象。</strong>
* <ul>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, boolean excludesFieldsWithoutExpose) {
return toJson(target, null, false, null, null, excludesFieldsWithoutExpose);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean}
* 对象。</strong>
* <ul>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param version 字段的版本号注解({@literal @Since})。
* @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, Double version, boolean excludesFieldsWithoutExpose) {
return toJson(target, null, false, version, null, excludesFieldsWithoutExpose);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
* <ul>
* <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param targetType 目标对象的类型。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, Type targetType) {
return toJson(target, targetType, false, null, null, true);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
* <ul>
* <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param targetType 目标对象的类型。
* @param version 字段的版本号注解({@literal @Since})。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, Type targetType, Double version) {
return toJson(target, targetType, false, version, null, true);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
* <ul>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param targetType 目标对象的类型。
* @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, Type targetType, boolean excludesFieldsWithoutExpose) {
return toJson(target, targetType, false, null, null, excludesFieldsWithoutExpose);
}
/**
* 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
* <ul>
* <li>该方法不会转换 {@code null} 值字段;</li>
* <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss};</li>
* </ul>
*
* @param target 要转换成 {@code JSON} 的目标对象。
* @param targetType 目标对象的类型。
* @param version 字段的版本号注解({@literal @Since})。
* @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.0
*/
public static String toJson(Object target, Type targetType, Double version, boolean excludesFieldsWithoutExpose) {
return toJson(target, targetType, false, version, null, excludesFieldsWithoutExpose);
}
/**
* 将给定的 {@code JSON} 字符串转换成指定的类型对象。
*
* @param <T> 要转换的目标类型。
* @param json 给定的 {@code JSON} 字符串。
* @return 给定的 {@code JSON} 字符串表示的指定的类型对象。
* @since 1.0
*/
public static <T> T fromJson(String json, Type type) throws Exception{
if( isBlankString(json) ) {
return null;
}
//GsonBuilder builder = new GsonBuilder();
// builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
String datePattern = DEFAULT_DATE_PATTERN;
builder.setDateFormat(datePattern);
Gson gson = builder.registerTypeAdapter(Boolean.class, booleanAsIntAdapter)
.registerTypeAdapter(boolean.class, booleanAsIntAdapter)
.excludeFieldsWithModifiers(Modifier.FINAL).create();
return gson.fromJson(json, type);
}
/**
* 将给定的 {@code JSON} 字符串转换成指定的类型对象。
*
* @param <T> 要转换的目标类型。
* @param json 给定的 {@code JSON} 字符串。
* @param token {@code com.google.gson.reflect.TypeToken} 的类型指示类对象。
* @param datePattern 日期格式模式。
* @return 给定的 {@code JSON} 字符串表示的指定的类型对象。
* @since 1.0
*/
public static <T> T fromJson(String json, TypeToken<T> token, String datePattern) {
if( isBlankString(json) ) {
return null;
}
// GsonBuilder builder = new GsonBuilder();
// builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
if( isBlankString(datePattern) ) {
datePattern = DEFAULT_DATE_PATTERN;
}
builder.setDateFormat(datePattern);
Gson gson = builder.registerTypeAdapter(Boolean.class, booleanAsIntAdapter)
.registerTypeAdapter(boolean.class, booleanAsIntAdapter)
.excludeFieldsWithModifiers(Modifier.FINAL).create();
try {
return gson.fromJson(json, token.getType());
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
/**
* 将给定的 {@code JSON} 字符串转换成指定的类型对象。
*
* @param <T> 要转换的目标类型。
* @param json 给定的 {@code JSON} 字符串。
* @param token {@code com.google.gson.reflect.TypeToken} 的类型指示类对象。
* @return 给定的 {@code JSON} 字符串表示的指定的类型对象。
* @since 1.0
*/
public static <T> T fromJson(String json, TypeToken<T> token) {
return fromJson(json, token, null);
}
/**
* 将给定的 {@code JSON} 字符串转换成指定的类型对象。<strong>此方法通常用来转换普通的 {@code JavaBean}
* 对象。</strong>
*
* @param <T> 要转换的目标类型。
* @param json 给定的 {@code JSON} 字符串。
* @param clazz 要转换的目标类。
* @param datePattern 日期格式模式。
* @return 给定的 {@code JSON} 字符串表示的指定的类型对象。
* @since 1.0
*/
public static <T> T fromJson(String json, Class<T> clazz, String datePattern) {
if( isBlankString(json) ) {
return null;
}
// GsonBuilder builder = new GsonBuilder();
if( isBlankString(datePattern) ) {
datePattern = DEFAULT_DATE_PATTERN;
}
builder.setDateFormat(datePattern);
Gson gson = builder.create();
try {
return gson.fromJson(json, clazz);
} catch (Exception ex) {
// Common.log("ws",json + " 无法转换为 " + clazz.getName() +
// " 对象!异常原因:"+ex.getMessage());
return null;
}
}
/**
* 将给定的 {@code JSON} 字符串转换成指定的类型对象。<strong>此方法通常用来转换普通的 {@code JavaBean}
* 对象。</strong>
*
* @param <T> 要转换的目标类型。
* @param json 给定的 {@code JSON} 字符串。
* @param clazz 要转换的目标类。
* @return 给定的 {@code JSON} 字符串表示的指定的类型对象。
* @since 1.0
*/
public static <T> T fromJson(String json, Class<T> clazz) {
return fromJson(json, clazz, null);
}
/**
* 将给定的目标对象根据{@code GsonBuilder} 所指定的条件参数转换成 {@code JSON} 格式的字符串。
* <p />
* 该方法转换发生错误时,不会抛出任何异常。若发生错误时,{@code JavaBean} 对象返回 <code>"{}"</code>;
* 集合或数组对象返回 <code>"[]"</code>。 其本基本类型,返回相应的基本值。
*
* @param target 目标对象。
* @param targetType 目标对象的类型。
* @param builder 可定制的{@code Gson} 构建器。
* @return 目标对象的 {@code JSON} 格式的字符串。
* @since 1.1
*/
public static String toJson(Object target, Type targetType, GsonBuilder builder) {
if( target == null )
return EMPTY_JSON;
Gson gson = null;
if( builder == null ) {
gson = new Gson();
} else {
gson = builder.create();
}
String result = EMPTY_JSON;
try {
if( targetType == null ) {
result = gson.toJson(target);
} else {
result = gson.toJson(target, targetType);
}
} catch (Exception ex) {
// Common.log("ws","目标对象 " + target.getClass().getName() +
// " 转换 JSON 字符串时,发生异常!异常原因:"+ex.getMessage());
if( target instanceof Collection<?> || target instanceof Iterator<?>
|| target instanceof Enumeration<?> || target.getClass().isArray() ) {
result = EMPTY_JSON_ARRAY;
}
}
return result;
}
private static final TypeAdapter<Boolean> booleanAsIntAdapter = new TypeAdapter<Boolean>()
{
@Override
public void write(JsonWriter out, Boolean value)
throws IOException {
if( value == null ) {
out.nullValue();
} else {
out.value(value);
}
}
@Override
public Boolean read(JsonReader in)
throws IOException {
JsonToken peek = in
.peek();
switch (peek) {
case BOOLEAN:
return in
.nextBoolean();
case NULL:
in.nextNull();
return null;
case NUMBER:
return in
.nextInt() != 0;
case STRING:
return Boolean
.parseBoolean(in
.nextString());
default:
throw new IllegalStateException(
"Expected BOOLEAN or NUMBER but was "
+ peek);
}
}
};
}
\ No newline at end of file
package com.xiaogu.xgvolleyex.utils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.xiaogu.xgvolleyex.BaseWebRequest;
/**
* Created by Phyllis on 15-4-15.
*/
public class NetworkStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
BaseWebRequest.tryToResumeRequest(context);
}
}
package com.xiaogu.xgvolleyex.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
import java.lang.reflect.Method;
public class NetworkUtils
{
public static boolean isNetworkEnable(Context context)
{
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo network = cm.getActiveNetworkInfo();
if (network != null)
{
return network.isAvailable();
}
return false;
}
public static boolean isSimExist(Context context)
{
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSimState() == TelephonyManager.SIM_STATE_READY;
}
public static boolean isWifiEnable(Context context)
{
WifiManager wm = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
return wm.isWifiEnabled();
}
public static void setWifiEnable(Context context, boolean enable)
{
// WifiManager wm = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
// wm.setWifiEnabled(enable);
}
public static boolean getMobileNetEnable(Context context)
{
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
State mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
return mobile == State.CONNECTED;
}
public static void setMobileNetEnable(Context context, boolean enable)
{
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
try
{
boolean isMobileDataEnable = getMobileNetEnable(context);
if (enable != isMobileDataEnable)
{
invokeBooleanArgMethod(cm, "setMobileDataEnabled", enable);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
@SuppressWarnings ({ "rawtypes", "unchecked" })
private static Object invokeBooleanArgMethod(ConnectivityManager cm, String methodName, boolean value)
throws Exception
{
Class ownerClass = cm.getClass();
Class[] argsClass = new Class[1];
argsClass[0] = boolean.class;
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(cm, value);
}
// =======================================
// Inner Classes/Interfaces
// =======================================
}
package com.xiaogu.xgvolleyex.utils;
import android.text.TextUtils;
/**
* Created by Phyllis on 15-4-11.
*/
public class XGCommonWSResult<T> {
/* 调用正常 响应正常 返回的appstate=1 */
public static final int APPSTATE_RESP_OK = 1;
/* 无网络连接 */
public static final int APPSTATE_NO_NETWORK_CONNECTION = -97;
/* 调用参数为空 */
public static final int APPSTATE_INVOKE_PARAMS_ERR = -96;
/* 服务器响应超时 (服务器异常) */
public static final int APPSTATE_RESP_TIMEOUT = -95;
/***
* appState用于指示ws程序的执行状况
* -3表示使用该ws的开发者的apiKey不正确
* -2表示传递给ws接口的传入参数有误(即不符合要求,验证不通过)
* -1表示ws程序执行失败,程序发生异常或者错误导致
* 1表示ws程序执行成功,默认为执行正确
*
* -99 表示客户端调用ws接口的程序发生异常
* -98 表示网络状况不佳
*/
private int appState = 1 ;
public static final String STATE_ERROR="FAILED";
public static final String STATE_SUCCESS="SUCCESS";
public static final String STATE_NO_DATA = "NO_DATA";
private String action;
private String v;
private boolean success;
private String retCode;
private String msg;
/***
* ws接口返回的结果值
*/
private T data;
public XGCommonWSResult(){
super();
}
public XGCommonWSResult(T data, String action, String v, String retCode, String msg) {
super();
this.data = data;
this.action = action;
this.v = v;
this.retCode = retCode;
this.msg = msg;
}
public boolean isSuccess(){
if(!TextUtils.isEmpty(retCode)){
return this.retCode.equals("SUCCESS");
}else{
return success;
}
}
public T getResult() {
return data;
}
public void setResult(T data) {
this.data = data;
}
public int getAppState() {
return appState;
}
public void setAppState(int appState) {
this.appState = appState;
}
@Override
public String toString() {
return "WsResult [appState=" + appState + ", action=" + action + ", v=" + v + ", retCode="
+ retCode + ", msg=" + msg + ", data=" + data + "]";
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public void setState(String state){
this.retCode = state;
}
public String getState(){
return retCode;
}
}
<resources>
<string name="app_name">XGVolleyEx</string>
</resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment