在简单的 xampp mysql 数据库中,将应用程序与 java 文件(如 main、数据库助手、登录、注册、产品、产品适配器、搜索菜单、启动和 android studio 中的 Utils)连接,出现错误,即 com.android.volley.TimeoutError
我在真实设备和虚拟设备上都试过了。
这是我的 php 连接到 db
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "db";
// Create connection
// create a connection to the database
$conn = mysqli_connect($servername, $username, $password, $dbname);
// check the connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// query to retrieve product data
$sql = "SELECT id, product, pkg, unit, company, salt, sr, mrp FROM fa1;";
// execute the query and get the result set
$result = mysqli_query($conn, $sql);
if (!$result) {
die("Query failed: " . mysqli_error($conn));
}
// create an empty array to hold the products
$products = array();
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$product = array(
'id' => $row['id'],
'product' => $row['product'],
'pkg' => $row['pkg'],
'unit' => $row['unit'],
'company' => $row['company'],
'salt' => $row['salt'],
'sr' => $row['sr'],
'mrp' => $row['mrp']
);
array_push($products, $product);
}
}
// close the database connection
mysqli_close($conn);
// set the response header to JSON
header('Content-Type: application/json');
// encode the products array in JSON format and return it
echo json_encode($products);
?>
这是我的数据库帮助文件,其中包含截击过程
package com.aumdistributor.loginapp;
import static androidx.constraintlayout.helper.widget.MotionEffect.TAG;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.RetryPolicy;
import com.android.volley.TimeoutError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "products.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_PRODUCTS = "products";
private static final String COLUMN_ID = "id";
private static final String COLUMN_PRODUCT = "product";
private static final String COLUMN_PKG = "pkg";
private static final String COLUMN_UNIT = "unit";
private static final String COLUMN_COMPANY = "company";
private static final String COLUMN_SALT = "salt";
private static final String COLUMN_SR = "sr";
private static final String COLUMN_MRP = "mrp";
private static final String CREATE_PRODUCTS_TABLE = "CREATE TABLE " + TABLE_PRODUCTS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY,"
+ COLUMN_PRODUCT + " TEXT,"
+ COLUMN_PKG + " TEXT,"
+ COLUMN_UNIT + " TEXT,"
+ COLUMN_COMPANY + " TEXT,"
+ COLUMN_SALT + " TEXT,"
+ COLUMN_SR + " DOUBLE,"
+ COLUMN_MRP + " DOUBLE"
+ ")";
// creating user table format
public static final String TABLE_USER = "user";
public static final String KEY_FULLNAME = "fullname";
public static final String KEY_USERNAME = "username";
public static final String KEY_PASSWORD = "password";
public static final String KEY_EMAIL = "email";
private static final String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_FULLNAME + " TEXT, " +
KEY_USERNAME + " TEXT, " +
KEY_EMAIL + " TEXT, " +
KEY_PASSWORD + " TEXT)";
//creating database for user and table for both userdata and productdata
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_PRODUCTS_TABLE);
db.execSQL(CREATE_USER_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public void getAllProducts(Context context, List<Product> productList, ProductAdapter productAdapter) {
String url = "http://192.168.**.**/get_product.php";
RequestQueue queue = Volley.newRequestQueue(context);
// Set a longer timeout for the request
int socketTimeout = 150000; // 30 seconds
RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
@SuppressLint("NotifyDataSetChanged") JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(
Request.Method.GET,
url,
null,
response -> {
// Parse the JSON array to a list of products
List<Product> products = new ArrayList<>();
for (int i = 0; i < response.length(); i++) {
try {
JSONObject productObj = response.getJSONObject(i);
Product product = new Product(
productObj.getInt(("id")), productObj.getString("product"),
productObj.getString("pkg"), productObj.getString("unit"),
productObj.getString("company"), productObj.getString("salt"),
productObj.getDouble("sr"), productObj.getDouble("mrp"));
products.add(product);
} catch (JSONException e) {
e.printStackTrace();
}
}
// Add the products to the adapter
productList.addAll(products);
productAdapter.notifyDataSetChanged();
},
error -> {
if (error instanceof TimeoutError) {
Toast.makeText(context, "Request timed out", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Error fetching products: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
Log.e("Volley Error", error.toString());
}
);
// Set the retry policy for the request
jsonArrayRequest.setRetryPolicy(policy);
queue.add(jsonArrayRequest);
}
public long addUser(String fullname, String username, String email, String password) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(KEY_FULLNAME, fullname);
contentValues.put(KEY_USERNAME, username);
contentValues.put(KEY_EMAIL, email);
contentValues.put(KEY_PASSWORD, password);
Log.d(TAG, "Attempting to insert user with the following details:");
Log.d(TAG, "Fullname: " + fullname);
Log.d(TAG, "Username: " + username);
Log.d(TAG, "Email: " + email);
Log.d(TAG, "Password: " + password);
long result = db.insert(TABLE_USER, null, contentValues);
db.close();
return result;
}
public boolean checkUser(String username) {
SQLiteDatabase db = getReadableDatabase();
String[] columns = {KEY_USERNAME};
String selection = KEY_USERNAME + " = ?";
String[] selectionArgs = {username};
Cursor cursor = db.query(TABLE_USER, columns, selection, selectionArgs, null, null, null);
int count = cursor.getCount();
cursor.close();
return count > 0;
}
public void addProduct(Product product) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_ID, product.getId());
values.put(COLUMN_PRODUCT, product.getProduct());
values.put(COLUMN_PKG, product.getPkg());
values.put(COLUMN_UNIT, product.getUnit());
values.put(COLUMN_COMPANY, product.getCompany());
values.put(COLUMN_SALT, product.getSalt());
values.put(COLUMN_SR, product.getSr());
values.put(COLUMN_MRP, product.getMrp());
db.insert(TABLE_PRODUCTS, null, values);
db.close();
}
public List<Product> getAllProductsFromDb() {
List<Product> productList = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM " + TABLE_PRODUCTS;
Cursor cursor = db.rawQuery(query, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID));
String product = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_PRODUCT));
String pkg = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_PKG));
String unit = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_UNIT));
String company = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_COMPANY));
String salt = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_SALT));
double sr = cursor.getDouble(cursor.getColumnIndexOrThrow(COLUMN_SR));
double mrp = cursor.getDouble(cursor.getColumnIndexOrThrow(COLUMN_MRP));
productList.add(new Product(id, product, pkg, unit, company, salt, sr, mrp));
}
cursor.close();
db.close();
return productList;
}
public boolean deleteProduct(int productId) {
SQLiteDatabase db = this.getWritableDatabase();
int rowsAffected = db.delete(TABLE_PRODUCTS, COLUMN_ID + "=?", new String[]{String.valueOf(productId)});
db.close();
return rowsAffected > 0;
}
}
注意:注册和登录活动都运行良好,但登录后,进程挂起一段时间,这在超时中提到,然后调试窗口中出现错误如下
Username: ashi
2023-02-27 14:48:06.309 3618-3618 FadeMove com.aumdistributor.loginapp D
2023-02-27 14:48:06.309 3618-3618 FadeMove com.aumdistributor.loginapp D Password: ****
2023-02-27 14:48:06.331 3618-3618 Compatibil...geReporter com.aumdistributor.loginapp D Compat change id reported: 147798919; UID 10154; state: ENABLED
2023-02-27 14:48:08.927 3618-3765 ibutor.loginap com.aumdistributor.loginapp I Waiting for a blocking GC ProfileSaver
2023-02-27 14:48:09.676 3618-3631 ibutor.loginap com.aumdistributor.loginapp I Background young concurrent copying GC freed 55525(1976KB) AllocSpace objects, 0(0B) LOS objects, 28% free, 4987KB/6966KB, paused 21.888ms total 790.976ms
2023-02-27 14:48:09.676 3618-3765 ibutor.loginap com.aumdistributor.loginapp I WaitForGcToComplete blocked ProfileSaver on ProfileSaver for 748.821ms
2023-02-27 14:48:22.162 3618-3618 AssistStructure com.aumdistributor.loginapp I Flattened final assist data: 2664 bytes, containing 1 windows, 19 views
2023-02-27 14:48:30.326 3618-3618 Choreographer com.aumdistributor.loginapp I Skipped 41 frames! The application may be doing too much work on its main thread.
2023-02-27 14:48:30.661 3618-3766 OpenGLRenderer com.aumdistributor.loginapp I Davey! duration=990ms; Flags=1, IntendedVsync=551727478915, Vsync=552410812221, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=552422319400, AnimationStart=552422430500, PerformTraversalsStart=552425418600, DrawStart=552685532500, SyncQueued=552704130300, SyncStart=552742871100, IssueDrawCommandsStart=552742989700, SwapBuffers=552750954200, FrameCompleted=552756988200, DequeueBufferDuration=771800, QueueBufferDuration=858700, GpuCompleted=0,
2023-02-27 14:48:30.697 3618-3766 OpenGLRenderer com.aumdistributor.loginapp I Davey! duration=1044ms; Flags=1, IntendedVsync=551727478915, Vsync=552410812221, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=552422319400, AnimationStart=552422430500, PerformTraversalsStart=552425418600, DrawStart=552758201600, SyncQueued=552758228100, SyncStart=552779646700, IssueDrawCommandsStart=552779723900, SwapBuffers=552782027700, FrameCompleted=552793386400, DequeueBufferDuration=338200, QueueBufferDuration=10224700, GpuCompleted=0,
2023-02-27 14:48:31.347 3618-3618 Choreographer com.aumdistributor.loginapp I Skipped 60 frames! The application may be doing too much work on its main thread.
2023-02-27 14:48:31.378 3618-3766 OpenGLRenderer com.aumdistributor.loginapp I Davey! duration=1046ms; Flags=0, IntendedVsync=552427529946, Vsync=553427529906, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=553443540200, AnimationStart=553443587400, PerformTraversalsStart=553455223500, DrawStart=553456486900, SyncQueued=553459256900, SyncStart=553459654900, IssueDrawCommandsStart=553467485800, SwapBuffers=553468956300, FrameCompleted=553474599400, DequeueBufferDuration=3238800, QueueBufferDuration=1298100, GpuCompleted=0,
2023-02-27 14:48:31.996 3618-3618 Choreographer com.aumdistributor.loginapp I Skipped 35 frames! The application may be doing too much work on its main thread.
2023-02-27 14:48:32.185 3618-3766 OpenGLRenderer com.aumdistributor.loginapp I Davey! duration=767ms; Flags=1, IntendedVsync=553493946983, Vsync=554077280293, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=554092326900, AnimationStart=554092348500, PerformTraversalsStart=554092377300, DrawStart=554220729400, SyncQueued=554223347500, SyncStart=554243240500, IssueDrawCommandsStart=554243478100, SwapBuffers=554252239300, FrameCompleted=554281648600, DequeueBufferDuration=19997200, QueueBufferDuration=667100, GpuCompleted=0,
2023-02-27 14:49:21.083 3618-3618 Compatibil...geReporter com.aumdistributor.loginapp D Compat change id reported: 150939131; UID 10154; state: ENABLED
afertimeout set = 2.5 mnts.
com.android.volley.TimeoutError