AndroidCSS

Android material design Programming Blog

Android AsyncTask to fetch PHP file without using any library

Tutorial is on, retrieving PHP file without using any library like volley or retrofit. Android AsyncTask and HttpURLConnection class is used.

Rather than using any library to fetch data from PHP Or JSON file, you can use 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 extra burden on your application in terms of application size.

I suggest you to use Android AsyncTask when there are fewer request made to server and in case of multiple request, use volley or any other libraries.

Let’s see how to fetch data from PHP file using Android AsyncTask.

Download Code From Github

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 Asynchronous task.
  • onPreExecute(), this method runs on UI thread. Here We are displaying loading message.
  • doInBackground(Params...), invoked on the background thread immediately after
    onPreExecute() finishes executing. The recieving of data from PHP file using HttpURLConnection class has done in this function.
  • onPostExecute(Result), collect the result from doInBackground(Params...) method. Here we are displaying data recieved 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>

8 Comments

Add yours

  1. 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..

    • @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.

      • 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. 🙂

        • @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 every catch block in your doInBackground() method or you can handle those error appropriately.

          Above code can be rewritten as

          pdLoading.dismiss();
          textPHP.setText(result.toString());

  2. 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.

  3. How I connect my php file with my android project and where it put

Leave a Reply

Your email address will not be published.

*

About | Policy | Disclaimer

Creative Commons LicenceUp ↑