Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

receiving data from web server doesn't work (volley library android)

For fetch data I use volley library. When i use Local Address everything work right. My activity shows data.

String json_url = "http://192.168.1.4/android/contactinfo.php";

but when I fetch data from Web server (internet) my activity doesn't show anything, so it is empty without any error

 String json_url = "http://www.viratebco.com/phpme/3/1.php";

I compared the output of these two pages and they were exactly like each other. this is my php code

    <?php
    error_reporting(0);
    @ini_set('display_errors', 0);
    $host="localhost";
    $username="root";
    $pwd="";
    $db="android";
    $con = mysqli_connect($host,$username,$pwd,$db) or die ('unable to connect');
   mysqli_set_charset($con, "utf8");
$sql = "SELECT * FROM imageactor";

$result = mysqli_query($con,$sql);

$response = array();
while($row = mysqli_fetch_array($result))
{
    array_push($response,array("Name"=>$row["name"],"Pic"=>$row["pic"],"Description"=>$row["description"]));

}
header("Connection: Keep-alive");
header("Content-length: 468");
header('Content-type: application/json');
echo json_encode($response,JSON_UNESCAPED_UNICODE);

and this is my class for fetch data of server

   public class BackgrundTask {
    Context context;
    ArrayList<Contact_actors_list> arrayList = new ArrayList<>();

    String json_url = "http://192.168.1.4/phpme/3/1.php";


    public BackgrundTask (Context context)
    {
        this.context = context;
    }


    public ArrayList<Contact_actors_list> getList()
    {


        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, json_url,(String) null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("TAG67", response.toString());
                        int count = 0;
                        while (count<response.length())
                        {
                            try {
                              //  Log.d("TAG67", "kk"+count);

                                JSONObject jsonObject = response.getJSONObject(count);
                             //   Log.d("TAG67", "Pic "+jsonObject.getString("Pic"));
                            //    Log.d("TAG67", "Description "+jsonObject.getString("Description"));
                            //    Log.d("TAG67", "Name "+jsonObject.getString("Name"));
                                Contact_actors_list contact_actors_list = new Contact_actors_list(jsonObject.getString("Name"),jsonObject.getString("Pic"),jsonObject.getString("Description"));
                                Log.d("TssssssssAG67", contact_actors_list.getDescription());
                                arrayList.add(contact_actors_list);
                                count++;

                            } catch (JSONException e) {
                                e.printStackTrace();
                                Log.e("tageiu", "Error at sign in : " + e.getMessage());


                            }
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                Log.e("ERtROR123", "Error123 "+ error.getMessage());
                Log.d("ERtROR123", "Error123 "+ error.getMessage());
            }

        }

        );
        int x=4;// retry count
        jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,
                x, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        MySingleton.getmInstance(context).addToRequestque(jsonArrayRequest);
        return arrayList;
    }
}

My MySingleton class

public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue requestQueue;
    private static Context mCtx;
    private MySingleton(Context context){
        mCtx = context;
        requestQueue = getRequestQueue();
    }

    public RequestQueue getRequestQueue()
    {
        if (requestQueue==null)
        {
            requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return  requestQueue;
    }
    public static synchronized MySingleton getmInstance(Context context)
    {
        if (mInstance == null)
        {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }
    public <T> void addToRequestque(Request<T> request)
    {
        request.setRetryPolicy(new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        requestQueue.add(request);
    }


}

My actorList Page

public class actorsList extends AppCompatActivity {
    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    RecyclerView.LayoutManager layoutManager;
    ArrayList<Contact_actors_list> arrayList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_actors_list);
        System.setProperty("http.keepAlive", "false");
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

        recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(actorsList.this, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {

                    @Override public void onItemClick(View view, int position) {
                        Intent intent = new Intent(actorsList.this, DetailsAsctor.class);
                        Contact_actors_list pp = arrayList.get(position);
                        intent.putExtra("pic", pp.getPic());
                        intent.putExtra("title", pp.getName());
                        startActivity(intent);
                        //Toast.makeText(actorsList.this,position,Toast.LENGTH_LONG).show();
                    }

                    @Override public void onLongItemClick(View view, int position) {
                        Toast.makeText(actorsList.this,"click",Toast.LENGTH_LONG).show();
                    }
                })
        );
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        BackgrundTask backgroundTask = new BackgrundTask(actorsList.this);
        arrayList = backgroundTask.getList();
        adapter = new RecyclerAdapterActorsList(arrayList);
        recyclerView.setAdapter(adapter);

    }

}

RecyclerAdapterActorsList

public class RecyclerAdapterActorsList extends RecyclerView.Adapter<RecyclerAdapterActorsList.MyViewHolder> {
    ArrayList<Contact_actors_list> arrayList = new ArrayList<>();

    public  RecyclerAdapterActorsList(ArrayList<Contact_actors_list> arrayList)
    {
        this.arrayList = arrayList;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_actors_list,parent,false);
        MyViewHolder myViewHolder = new MyViewHolder(view);

        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        holder.Name1.setText(arrayList.get(position).getName());
        holder.Description1.setText(arrayList.get(position).getDescription());
        Picasso.with(holder.Pic1.getContext()).load(Uri.parse(arrayList.get(position).getPic())).into(holder.Pic1);

    }
    @Override
    public int getItemCount() {
        return arrayList.size();
    }
    public static class MyViewHolder extends RecyclerView.ViewHolder
    {

        TextView Name1;
        TextView Description1;
        ImageView Pic1;
        public MyViewHolder(View itemView) {

            super(itemView);
            Name1 = (TextView) itemView.findViewById(R.id.name);
            Description1 = (TextView) itemView.findViewById(R.id.description);
            Pic1  = (ImageView) itemView.findViewById(R.id.pic);

        }
    }


}

My app works right but just when i fetch data from local services.

like image 878
pedram shabani Avatar asked Aug 26 '17 17:08

pedram shabani


People also ask

How to get data from API in Android using Android volley?

Below is the dependency for Volley which we will be using to get the data from API. For adding this dependency navigate to the app > Gradle Scripts > build.gradle (app) and add the below dependency in the dependencies section. After adding this dependency sync your project and now move towards the AndroidManifest.xml part.

What is volley library in Android?

Volley is an HTTP library that makes networking very easy and fast, for Android application development. What are benefits of Android Volley? Fast in fetching data from Any network. Easily customizable according to our need.

What can be done with networking in Android using volley?

All the tasks that need to be done with Networking in Android, can be done with the help of Volley. Automatic scheduling of network requests. Multiple concurrent network connections. Canceling request API. Request prioritization. Volley provides debugging and tracing tools.

How does volley work with recurring data requests?

Whenever a recurring data request is made by the user, rather than fetching the data from the server, Volley directly brings it from the cache saving resource and improves the overall user experience.


1 Answers

Update:

I checked your code everything was at it's place except listener.onReponseReceive(arrayList); as mentioned in my answer it should be right after where while loop ends. Now your recyclerview is displaying items

Update:

The reason You are not getting the list in your recyclerview is because it takes some time to fetch response from webserver and your list get return earlier. In order to Resolve this, Try this

Create an Interface

    public interface WebResponseListener{
     void onReponseReceive(ArrayList <Contact_actors_list> list);
   }

In your BackgrundTask declare a variable of this interface

WebResponseListener listener;
public BackgrundTask (Context context,WebResponseListener listener)
    {
       this.listener = listener
        this.context = context;
    }

Make your getList() return void and do the following changes

 public void getList(){
//Where your while condition ends
//add following line
  listener.onReponseReceived(arrayList);
    -----
}

IN actorsList class Make yout actorList class implements the inferface as

public class actorsList extends AppCompatActivity implements WebResponseListener

replace the following lines

BackgrundTask backgroundTask = new BackgrundTask(actorsList.this); 
 arrayList = backgroundTask.getList();

with

BackgrundTask backgroundTask = new BackgrundTask(this,this); 
arrayList = new ArrayList<>();
adapter = new RecyclerAdapterActorsList(arrayList);
recyclerView.setAdapter(adapter);
backgroundTask.getList();

Add the following method in your actorsList class

public void onReponseReceive(ArrayList <Contact_actors_list> list){
    actorsList.this.arrayList.addAll(list);
    actorsList.this.adapter.notifyDataSetChanged();
}

Recyclerview

like image 57
Sahil Avatar answered Oct 24 '22 17:10

Sahil