从Web服务器接收数据不起作用(Volley Library Android) [英] receiving data from web server doesn't work (volley library android)

查看:126
本文介绍了从Web服务器接收数据不起作用(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";

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

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

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

我的MySingleton课程

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


}

我的演员列表页面

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.

推荐答案

更新:

我检查了您的代码,除此以外的所有内容 listener.onReponseReceive(arrayList);正如我在回答中提到的那样 应该在while循环结束的位置之后.现在,您的recyclerview是 显示项目

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

更新:

您未在recyclerview中获得列表的原因是 因为从网络服务器和您的服务器获取响应需要一些时间 列表得到更早的回报.为了解决这个问题,请尝试

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

创建界面

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

在BackgrundTask中声明此接口的变量

In your BackgrundTask declare a variable of this interface

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

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

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类 使您的actorList类将接口实现为

IN actorsList class Make yout actorList class implements the inferface as

public class actorsList extends AppCompatActivity implements WebResponseListener

替换以下几行

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

使用

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

在actorsList类中添加以下方法

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

这篇关于从Web服务器接收数据不起作用(Volley Library Android)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆