gpt4 book ai didi

php - 从 Web 服务器接收数据不起作用( Volley 库 android)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:04:22 25 4
gpt4 key购买 nike

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

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

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

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


}

我的 Actor 列表页面

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

创建一个接口(interface)

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

在你的 BackgrundTask 中声明一个这个接口(interface)的变量

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 类将接口(interface)实现为

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 类中添加以下方法

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

Recyclerview

关于php - 从 Web 服务器接收数据不起作用( Volley 库 android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45897838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com