从Web服务器接收数据不起作用(排球库android)

时间:2022-10-22 20:41:44

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

对于获取数据,我使用volley库。当我使用本地地址一切正常。我的活动显示数据。

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

但是当我从Web服务器(互联网)获取数据时,我的活动没有显示任何内容,所以它是空的,没有任何错误

 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代码

    <?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

我的MySingleton课程

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

我的actorList页面

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

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.

我的应用程序工作正常,但就在我从本地服务获取数据时。

1 个解决方案

#1


3  

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

我检查了你的代码除了listener.onReponseReceive(arrayList)之外的所有东西都在它的位置;正如我的回答中所提到的,它应该在while循环结束之后。现在您的recyclerview正在显示项目

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

您没有在recyclerview中获取列表的原因是因为从Web服务器获取响应需要一些时间,并且您的列表会提前返回。要解决此问题,请尝试此操作

Create an Interface

创建一个接口

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

In your BackgrundTask declare a variable of this interface

在BackgrundTask中声明此接口的变量

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

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

使getList()返回void并执行以下更改

 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

IN actorsList类让你的actorList类实现了下面的表面

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

在actorsList类中添加以下方法

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

从Web服务器接收数据不起作用(排球库android)

#1


3  

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

我检查了你的代码除了listener.onReponseReceive(arrayList)之外的所有东西都在它的位置;正如我的回答中所提到的,它应该在while循环结束之后。现在您的recyclerview正在显示项目

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

您没有在recyclerview中获取列表的原因是因为从Web服务器获取响应需要一些时间,并且您的列表会提前返回。要解决此问题,请尝试此操作

Create an Interface

创建一个接口

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

In your BackgrundTask declare a variable of this interface

在BackgrundTask中声明此接口的变量

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

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

使getList()返回void并执行以下更改

 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

IN actorsList类让你的actorList类实现了下面的表面

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

在actorsList类中添加以下方法

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

从Web服务器接收数据不起作用(排球库android)