آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

وبسرویس نسبتا کامل مبتنی بر volley

hadighorbani  8 سال پیش  8 سال پیش
+11 0

سلام و عرض خسته نباشید خدمت دوستان

آقا به درخواست این شرکت مون دارم یه وبسرویسی مینویسم مبتنی بر 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);
}

// دانلود رو هم در پاسخ ها میزارم
 
 متد saveAbleGetConnection که با این متد میتونید یه نمونه از این متد رو توی یه متغیر ذخیره کنید:
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;
}
 
+1 0
سلام ؛ من از متد getConnection استفاده می کنم ولی میخوام وقتیکه به سرور وصل شد و اطلاعاتش رو خوند مثلا توی متغیری مثل result ذخیره کنم تا بتونم ازش در کلاس دیگه استفاده کنم . چه جوری باید تعریفش کنم ؟ سپاسگزارم . (8 سال پیش)
+3 0
سلام. متد get کانکشن رو من void در نظر گرفتم. یعنی خروجیی بر نمیگردونه. شما میتونید به دلخواه خودتون متد رو از void بودن در بیاریدش و به String تبدیلش کنید و با چند تا تغییر کوچیک ازش خروجی String بگیرید (8 سال پیش)
+2 0
@MarAnd متد مورد نظرتون رو هم اضافه شد ( saveAbleGetConnection ) (8 سال پیش)
0 0
سپاسگزارم من هم با تغییراتی که دادم تونستم response رو در متد onResponse ذخیره کنم ولی متد اصلیم void هست . ولی تغییر شما بهتره . (8 سال پیش)
0 0
یه سوال دیگه هم داشتم ببخشید ، تو اموزش ها از روش post برای ارسال اطلاعات به سرور از دستوراتی مثل () UrlEncodeFormEntity استفاده شده و یا اینکه arraylist ای از NameValuePair استفاده شده . الان جایگزینش همه ی اینها متد postConnection هست که شما اموزش دادین ؟ (8 سال پیش)
0 0
فکر کنم این متد مشکل داره ... getResult رو که نمیتونه برگردونه !! (8 سال پیش)
0 0
خب در متد post ما key هارو چطور ارسال کنیم؟ (8 سال پیش)
+2 0
توی متد پست، که map هم هستش، میتونید پارامتر هاتونو نسبت به نیازتون تغییر بدید (8 سال پیش)
+1 0
تو کلس اینترتن باید یه فیلد تعریف کنید به نام getResult بصورت private تعریفش بکنید که از خارج کلاس قابل دسترس نباشه (8 سال پیش)
+2 0
سلام، توی متد saveAbleGetConnection توسط getResult نمیشه خروجی گرفت و getResult همیشه null بر میگردونه، به این دلیل که return این متد زودتر از اجرای onResponse انجام میشه. من برای خروجی گرفتن از این متد یک Listener تعریف کردم که کار سختی نیست، اگه نیاز بود بگید کدش رو بزارم. (8 سال پیش)
+1 0
ممنون میشم امید جان با توضیحات این مشکل رو توی یک پاسخ قرار بدی (8 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
hadighorbani  8 سال پیش
+6 0

اینم متد 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();
}
}

امیدوارم به دردتون خورده باشه ( گفتم که ناقصه تو تکمیلش اگه تونستید و وقت داشتید نظر بدید ) موفق و سربلند باشید

+1 0
سلام مرسی از آموزش خوبت میشه در مورد امنیتش هم یه آموزشی بزاری؟ که از چجور امنیتی استفاده کردی؟ (8 سال پیش)
+1 0
سلام انشالله سعی میکنم تا اخر هفته بحث امنیتشو رو به راه بکنم (8 سال پیش)
پاسخ به سوال 
hadighorbani  8 سال پیش
+2 0

نحوه ی 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();
}
+2 0
این که یه متد داشته باشین که هر ثانیه اینترنت رو چک کنه به شدت کار اشتباهی هست. شما باید یه Reciever داشته باشین تا هر وقت state ـ اینترنت تغییر پیدا کرد به شما اطلاع بده نه این که مدام چک کنین. (8 سال پیش)
+1 0
usage یعنی چی؟ (8 سال پیش)
+1 0
سلام usage یعنی نحوه ی استفاده. 2 اینکه نسبت به کلاس اینترنتی که دارم من این متد و ترد رو نوشتم که نشون بدم با این متد میشه این کارارو هم انجام دادش. وگرنه بله روش صحیحش قرار دادن یه listener هستش (8 سال پیش)
پاسخ به سوال 
hadighorbani  8 سال پیش
+4 0

قبلا یک ترد نوشته بودم برای چک کردن کانکشن لحظه به لحظه ی اینترنت. خب این کار اصولا درست نیست و پرفرمنس کار و پروژه رو به شدت پایین میاره و فقط کار مارو  همینجوری الکی راه میندازه پس قطعا روش مناسبی نیست.برای همین یک کلا نوشتم ( البته میشد این کلاس رو بصورت 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>

از سرویس های خود اندروید استفاده کردم. هر سوالی داشتید بفرمائید.

+1 0
در مورد طریقه استفادش هم یه توضیحی بدید ممنون میشم. (8 سال پیش)
+3 0
بله حتما، این رو توی 2 یا 3 تا پروژه قبلیم استفاده کرده بودم الان نمیدونم دقیقا کجا ازش استفاده کردم. اما تا اونجایی که یادم میاد متد checkInternetConnection توی کلاس اینترنت نوشته بودم و از طریق instanceیی که درست کرده بودم اینطور عمل کردم reciever.onReceive(context,null) (8 سال پیش)
پاسخ به سوال 
امید  8 سال پیش
+4 0

برای ارسال و دریافت اطلاعات از سرور به روش 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);
}
};

 


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .