从Web服务器接收数据不起作用(Volley Library Android) [英] 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";
但是当我从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屋!