وبسرویس نسبتا کامل مبتنی بر volley
سلام و عرض خسته نباشید خدمت دوستان
آقا به درخواست این شرکت مون دارم یه وبسرویسی مینویسم مبتنی بر volley چندان کامل هم نیست( بخاطر همین از دوستان خواهش دارم هر متد خوب و به درد بخوری که به ذهنشون میرسه رو بگن یا کدشو بزارن که ما بقی دوستان هم ازش بتونن نهایت استفاده رو ببرن ) گفتم این کدارو با شما به اشتراک بزارم تا ازش بتونید استفاده بکنید.
تواین کلاس فعلا 4 تا متد گذاشتم :
1- isNetworkAvailable
2- getConnection
3- postConnection
4- download
مواد لازم :
minSdk = 14
permissions :
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
android:name=".G" // اینو هم که میشناسینش
خب بعد از این یه کلاسی بسازید به نام Internet و توش این متدارو رو بزاری:
-isNetworkAvailable : برای فهمیدن اینکه کانکشن داریم یا نه
public boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
-postConnection :برای ارسال اطلاعات به سرور
public void postConnection(final Context context,final String serverUrl, final String sendingUrl){
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest postRequest = new StringRequest(Request.Method.POST, serverUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// response
Log.e("LOG", "Successfull");
if(response.toString() == "1"){
Log.e("ErrorLog", "Invalid URL");
}else if(response.toString() == "2"){
Log.e("ErrorLog", "android ID is invalid");
}else {
Intent intent = new Intent(G.context, MainActivity.class);
intent.putExtra("Response", "" + response.toString());
Log.w("LOG", "Response is : " + response.toString());
}
}
},
new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
// error
Log.e("LOG", "Error");
Log.e("LOG", error.toString());
}
})
{
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
String android_id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
String u = params.put("url", sendingUrl);
params.put("android_id",android_id);
return params;
}
};
queue.add(postRequest);
}
-getConnection: برای خوندن سورس یه وبسایت
public void getConnection(Context context, String url){
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("LOG", "response from getConnection : " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("LOG", error.toString());
}
});
queue.add(request);
}
// دانلود رو هم در پاسخ ها میزارم
protected String saveAbleGetConnection(Context context, String url){
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.w("LOG", "Lengh of Data Befor : " + getResult.length());
getResult = response.toString();
Log.e("LOG", "Lengh of Data After : " + getResult.length());
Log.e("LOG", "Data : " + getResult);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
getResult = error.toString();
}
});
queue.add(request);
return getResult;
}












اینم متد download :
public void download(String file_url,String fileName, String format){
Uri downloadUri = Uri.parse(file_url);
DownloadManager.Request request = new DownloadManager.Request(downloadUri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false).setTitle("MrApp_DownloadManager")
.setDescription("Some Description About Mrapp Downloader")
.setDestinationInExternalPublicDir("/mr_app", fileName+ "." + format);
G.downloadManager.enqueue(request);
}
و اینم کلاس G :
public class G extends Application{
public static Context context;
public static DownloadManager downloadManager;
public static Handler HANDLER = new Handler();
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_APP = DIR_SDCARD + "/mr_app";
@Override
public void onCreate() {
super.onCreate();
File file = new File(DIR_APP);
if(!file.exists()){
file.mkdirs();
}
downloadManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
context = getApplicationContext();
}
}
امیدوارم به دردتون خورده باشه ( گفتم که ناقصه تو تکمیلش اگه تونستید و وقت داشتید نظر بدید ) موفق و سربلند باشید

نحوه ی usage کردنش فک نکنم کار سختی باشه اما برای تکمیل کار اینو هم میزارم اینجا :
Internet internet; // این تیکه رو بصورت پابلیک تعریف کنید تا در کل کلاس قابل دسترس باشه
یه متد برای راحت تر شدن و یکپارچه تر شدن log هام :
private void log (String filterName, String outputName){
Log.w(filterName, outputName);
}
یه ترد برای چک کردن لحظه به لحظه ی کانکشن داشتن به نت :
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
while(true){
if(internet.isNetworkAvailable(G.context) == false){
log("LOG", "Network status : " + internet.isNetworkAvailable(G.context));
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
main_url = edt_url.getText().toString();
if (edt_url.length() > 0) {
edt_url.getText().clear();
internet.postConnection(G.context, url, main_url);
} else {
log("LOG", "Edit text is Null");
Toast.makeText(MainActivity.this, "لطفا ورودی خود را چک نمائید", Toast.LENGTH_SHORT).show();
}

قبلا یک ترد نوشته بودم برای چک کردن کانکشن لحظه به لحظه ی اینترنت. خب این کار اصولا درست نیست و پرفرمنس کار و پروژه رو به شدت پایین میاره و فقط کار مارو همینجوری الکی راه میندازه پس قطعا روش مناسبی نیست.برای همین یک کلا نوشتم ( البته میشد این کلاس رو بصورت Nested Class هم بنویسم اما گفتم برای تمیزی کار یه کلاس جدا بسازم براش )برای بررسی وضعیت اینترنت.
به همین خاطر به روش زیر کار میکنیم:
public class NetworkStatusReciever extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
// final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//
// final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//
// final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
//
// if (wifi.isAvailable() || mobile.isAvailable()) {
// // Do some work from internet
// Log.d("LOG", "#Flag: 1");
// Log.d("LOG", "#Flag: " + connMgr);
// }else{
// Log.e("LOG", "#Flag: 0");
// }
checkInternetConnection(context);
}
private boolean checkInternetConnection(Context context) {
ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable() && conMgr.getActiveNetworkInfo().isConnected()) {
Log.w("LOG", "Connection is OK");
return true;
} else {
Log.e("LOG","Internet Connection Not Present");
return false;
}
}
}
این هم از منیفست :
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:name=".G"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".LoginActivity"/>
</application>
از سرویس های خود اندروید استفاده کردم. هر سوالی داشتید بفرمائید.

برای ارسال و دریافت اطلاعات از سرور به روش Post میشه از این روش استفاده کرد:
این کلاس رو از برنامه خودم برداشتم و خیلی چیزاش رو حذف کردم و بعضیاشم گذاشتم بمونه که اگر بدرد کسی خرد استفاده کنه، اگرم بدردتون نخورد اضافیاش رو حذف کنید.
public class Internet {
public interface ReturnConnection {
void returnConnection(String response);
}
public ReturnConnection returnConnection;
public void connection(final String action, final HashMap<String, String> putAction, final JSONObject json) {
final RequestQueue requestQueue = Volley.newRequestQueue(G.context);
StringRequest signInStringRequest = new StringRequest(Request.Method.POST, "www.url.com", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(returnConnection != null) {
returnConnection.returnConnection(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("LOG", "Error: " + error.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("action", action);
if(json != null) {
params.put("json", json.toString());
} else if(putAction != null) {
for(String put : putAction.keySet()) {
params.put(put, putAction.get(put));
}
}
return params;
}
};
requestQueue.add(signInStringRequest);
}
}
طریقه استفاده هم به صورت زیر:
Internet internet = new Internet();
internet.connection("signUp", null, jsonObject);
internet.returnConnection = new Internet.ReturnConnection() {
@Override
public void returnConnection(String response) {
Log.i("LOG", "Listener Response: " + response);
}
};
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .