对于获取数据,我使用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 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; } }
我的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); } }
我的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
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); } } }
我的应用程序工作正常,但就在我从本地服务获取数据时.
更新:
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
更新:
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中声明此接口的变量
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 actorsList类
让你的actorList类实现了这个界面
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();
public void onReponseReceive(ArrayList <Contact_actors_list> list){ actorsList.this.arrayList.addAll(list); actorsList.this.adapter.notifyDataSetChanged(); }