从网络服务器接收数据不起作用(volley库android)

2023-12-22

为了获取数据,我使用 Volley 库。当我使用本地地址时,一切正常。我的活动显示数据。

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

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

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

我比较了这两个页面的输出,它们彼此完全相同。 这是我的 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);

这是我用于获取服务器数据的类

   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;
    }
}

我的单例类

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);
    }


}

我的演员列表页

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);

    }

}

RecyclerAdapterActors列表

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);

        }
    }


}

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


Update:

我检查了你的代码,除了 监听器.onReponseReceive(arrayList);正如我的回答中提到的 应该就在 while 循环结束之后。现在你的回收者视图是 显示项目

Update:

您没有在回收视图中获取列表的原因是 因为从网络服务器和您的服务器获取响应需要一些时间 列表更早返回。为了解决这个问题,试试这个

创建接口

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

在您的 BackgrundTask 中声明此接口的变量

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

使您的 getList() 返回 void 并进行以下更改

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

IN 演员列表类 让你的 actor List 类实现接口为

public class actorsList extends AppCompatActivity implements WebResponseListener

替换以下行

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();

在 actorList 类中添加以下方法

public void onReponseReceive(ArrayList <Contact_actors_list> list){
    actorsList.this.arrayList.addAll(list);
    actorsList.this.adapter.notifyDataSetChanged();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从网络服务器接收数据不起作用(volley库android) 的相关文章

随机推荐