This tutorial is on, retrieving PHP file without using any library like volley or retrofit, To do that we are making use of Android AsyncTask and HttpURLConnection class.
Rather than using any library to fetch data from PHP Or JSON file, you can use a standard method of Android AsyncTask and HttpURLConection class. One advantage of using Android AsyncTask over any library is file size, using any library in your code puts an extra burden on your application in terms of application size.
I suggest you use AsyncTask when there is only a fewer request made to the server and in case of multiple requests, use volley or any other libraries.
Let’s see how to fetch data from PHP file using Android AsyncTask.
PHP
A sample PHP file.
<?php
echo "Success! This message is from PHP";
?>
Android
The files involved are as follow.
MainActivity.java with Android AsyncTask
Here are the major steps involved.
- Immediate after Activity is created an object of
AsyncRetrieve
class is created to carry out the Asynchronous task. onPreExecute()
, this method runs on UI thread. Here We are displaying a loading message.doInBackground(Params...)
, invoked on the background thread immediately after
onPreExecute()
finishes executing. The receiving of data from PHP file using theHttpURLConnection
class has done in this function.onPostExecute(Result)
, collect the result fromdoInBackground(Params...)
method. Here we are displaying data received from PHP file.
package com.androidcss.asyncexample;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
// CONNECTION_TIMEOUT and READ_TIMEOUT are in milliseconds
public static final int CONNECTION_TIMEOUT = 10000;
public static final int READ_TIMEOUT = 15000;
TextView textPHP;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textPHP = (TextView) findViewById(R.id.textPHP);
//Make call to AsyncRetrieve
new AsyncRetrieve().execute();
}
private class AsyncRetrieve extends AsyncTask<String, String, String> {
ProgressDialog pdLoading = new ProgressDialog(MainActivity.this);
HttpURLConnection conn;
URL url = null;
//this method will interact with UI, here display loading message
@Override
protected void onPreExecute() {
super.onPreExecute();
pdLoading.setMessage("\tLoading...");
pdLoading.setCancelable(false);
pdLoading.show();
}
// This method does not interact with UI, You need to pass result to onPostExecute to display
@Override
protected String doInBackground(String... params) {
try {
// Enter URL address where your php file resides
url = new URL("http://192.168.1.7/example.php");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return e.toString();
}
try {
// Setup HttpURLConnection class to send and receive data from php
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(READ_TIMEOUT);
conn.setConnectTimeout(CONNECTION_TIMEOUT);
conn.setRequestMethod("GET");
// setDoOutput to true as we recieve data from json file
conn.setDoOutput(true);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return e1.toString();
}
try {
int response_code = conn.getResponseCode();
// Check if successful connection made
if (response_code == HttpURLConnection.HTTP_OK) {
// Read data sent from server
InputStream input = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
// Pass data to onPostExecute method
return (result.toString());
} else {
return ("unsuccessful");
}
} catch (IOException e) {
e.printStackTrace();
return e.toString();
} finally {
conn.disconnect();
}
}
// this method will interact with UI, display result sent from doInBackground method
@Override
protected void onPostExecute(String result) {
pdLoading.dismiss();
if(result.equals("Success! This message is from PHP")) {
textPHP.setText(result.toString());
}else{
// you to understand error returned from doInBackground method
Toast.makeText(MainActivity.this, result.toString(), Toast.LENGTH_LONG).show();
}
}
}
}
activity_main.java
XML file for MainActivity.java
<?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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView android:text="Something went Wrong!" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textPHP" android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
AndroidManifest.xml
Make sure you added, below marked code to your AndroidManifest file.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidcss.asyncexample" >
<uses-permission android:name="android.permission.INTERNET"/>
<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" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
October 8, 2020 at 2:53 pm
hello, why it does not get all data of my url ?
September 3, 2019 at 6:24 am
Thank-you so much Gururaj P Kharvi.
October 23, 2018 at 10:11 pm
Thank you very much! I was searching for this tutorial and none worked. Your code helped me out. Keep up the good work!
July 11, 2017 at 9:04 am
Thank you!!
March 30, 2017 at 3:05 pm
How I connect my php file with my android project and where it put
April 12, 2017 at 7:43 am
The php file resides on server, it may be online or offline server(localhost) you just need to specify URL of your file.
January 9, 2017 at 8:18 am
Hi, Gururaj P Kharvi
I tried your tutorial, but there is something error.
I use WAMP and Android Studio without emulator.
conn.getResponseCode();
The result of that statement above is 403 or HTTP_Forbidden.
Please advice, sir.
Thank you very much.
May 22, 2016 at 4:46 am
Hi, I already tried Android to fetch PHP file without using any library more than 10times…
However it appear unsuccessful toast message..
Can I know any possibilities reason my project doesnt work?
Really need help.
Thank you in advance..
May 22, 2016 at 5:17 am
@mira
you are getting ‘unsuccessful’ message because the URL you specified is not valid, enter your url(where your php file resides) in browser and check for whether address is valid. you can check above code for
return "unsuccessful";
when it fails to connect.Let me know whether your problem solved or not. If you really require any help from my side then i assist you through TeamWeaver.
May 23, 2016 at 7:42 am
It work at last.. thank you so much..
However, if I want to display information using php file, I should enter same word in MainActivity.java?
Because when I tried to change the words at php file, it wont display php file text at android screen but it show in toast message. I dont really know how to change the code here..
pdLoading.dismiss();
if(result.equals(“Success! This message is from PHP”)) {
textPHP.setText(result.toString());
}else{
// you to understand error returned from doInBackground method
Toast.makeText(MainActivity.this, result.toString(), Toast.LENGTH_LONG).show();
}
Thank you for your respond. 🙂
May 23, 2016 at 8:28 am
@Mira
In class which extends Android AsyncTask, I returned all exception and displayed them on Toast message because, you to understand what and where exactly error is occuring. Now, there is a no need of if statement, remove
return
statement from everycatch block
in yourdoInBackground()
method or you can handle those error appropriately.Above code can be rewritten as
pdLoading.dismiss();
textPHP.setText(result.toString());