پست یا login شدن در اندروید از طریق کتابخانه volley
پیشتر برنامه نویسان برای ارسال داده ها با استفاده از روش پست از کلاس استاندارد جاوا با نام java.net.HttpURLConnection و کلاس استاندارد آپاچی با نام org.apache.http.client استفاده می کردند. محدودیت های روش های مذکور از جمله غیرموازی بودن عملیات های ارتباط با سرور موجب شد شرکت توسعه دهنده اندروید روش جدیدی را تحت عنوان کتابخانه volley به برنامه نویسان ارائه کند که در این روش عملیات های موازی امکانپذیر شده است.
برای استفاده از این روش ابتدا کد مربوط به این کتابخانه را در قسمت وابستگی ها یا dependencies (که در builde gradle یا ماژول های اپلیکیشن قرار دارد) که در ذیل به رنگ قرمز مشخص شده است اضافه کرده و از قسمت بالای پنجره ادیتور آن را sync می کنیم
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:design:23.0.1'
compile 'com.mcxiaoke.volley:library:1.0.19'
}
سپس با استفاده از کدهای زیر
1- ابتدا کلاس volley را فراخوانی می کنیم
2- url یا آدرس مربوط به فایل php خود در سرور را مشخص می کنیم.
3- کلاسrequest را به منظور پست دادها با متد post فرخوانی کرده و همزمان متدهای مربوط به آن را به منظور دریافت response و خطاهای ناشی از آن را فراخوانی یا ایمپلمنت می کنیم. در نهایت با قرار دادن پارامتر مورد نظر در hashmap ، رکوئیست خود را اجرا می کنیم
RequestQueue queue = Volley.newRequestQueue(this); url = "http://example.ir/post.php"; StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // response Toast.makeText(this, response.toString(), Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // error Toast.makeText(myContext, error.toString(), Toast.LENGTH_LONG).show(); } } ) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("username", user); params.put("password", pass); return params; } }; queue.add(postRequest); }
اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را ایجاد کنید
اکلیپس :File ⇒ New Android ⇒ Application Project
اندروید استودیو :File ⇒ New ⇒ New Project
اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk و نوع اکتیویتی (blank یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود را همان MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای xml زیر را به آن اضافه کنید:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" 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" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.psrd.test.MainActivity" tools:showIn="@layout/activity_main"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_alignParentTop="true" android:layout_marginTop="113dp" android:hint="username" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_below="@+id/editText" android:layout_marginTop="32dp" android:hint="password" android:layout_alignRight="@+id/editText" android:layout_alignEnd="@+id/editText" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="login" android:id="@+id/button" android:layout_below="@+id/editText2" android:layout_centerHorizontal="true" android:layout_marginTop="121dp" /> </RelativeLayout>
همانطور که در بالا می بینیم در لایوت مربوط به اکتیویتی اصلی باتنی را با ایدی button تعریف کرده ایم. که قرار است که با کلیک بر روی دکمه عملیات postانجام شود. همینطور دو EditText تعریف کرده ایم که قرار است یوزر و پسورد کاربر در داخل آنها نوشته شود. از این رو باتن و دو edittext را برای کلاس اصلی خود تعریف می کنیم. و سپس بر اساس توضیحات بالا متدی ساختیم که قرار است با سه آرگومان خود عملیات پست را انجام دهد . اولی آدرس فایل php در سرور- دومی یوزر و سومی پسورد است. به این ترتیب نوعی عملیاتی که با کلیک بر روی باتن انجام خواهد شد ابتدا گرفتن ورودی ها و تبدیل آن به String و سپس پست آن به آدرس تعیین شده در آرگومان خواهد بود.
package com.example.psrd.test; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity { private EditText textuser,Textpass; private Button btnsend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textuser = (EditText)findViewById(R.id.editText); Textpass = (EditText)findViewById(R.id.editText2); btnsend = (Button)findViewById(R.id.button); btnsend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String username = textuser.getText().toString(); String password = Textpass.getText().toString(); String url = "http://psrd.ir/mypost.php"; postvolley( url, username, password); } }); } public void postvolley(String url, final String username, final String password) { RequestQueue queue = Volley.newRequestQueue(this); StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // response Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // error Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_LONG).show(); } } ) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("username", username); params.put("password", password); return params; } }; queue.add(postRequest); } }
در نهایت در قسمت AndroidManifest.xml یا همان مانیفیست برنامه مجوز دسترسی به اینترنت و شبکه را تعریف می کنیم.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.psrd.test"> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
در سمت سرور نیز کدهای php زیر را با نام و آدرسی که در آرگومان متد فوق تعریف کرده اید قرار دهید.
<?php if (isset($_POST["username"]) && !empty($_POST["password"])) { echo "Yes, your account is set"; }else{ echo "N0,your account is not set"; } ?>
در نهایت برنامه را اجرا کرده و در آموزش هرچه بیشتر خود بهره بگیرید. کپی برداری برای سایت ها و وبلاگ ها هم من راضی نیستم.
1 دیدگاه
صلاح · سپتامبر 27, 2018 در 7:12 ق.ظ
سلام وقت بخیر این کد شما رو من پیاده کردم الان پیغام میده connection Exeption : connection refused
دلیلش چیه؟