问题
I'm trying to get data to form server in Andriod app using Volley library. My data was too large when I request to fetch data but the problem was volley time out error and I also used RetryPolicy but the problem was the same. How can I fix it?
I have already tried RetryPolicy and AsynTask but my issue can't resolve. Can anyone tell me how to resolve this issue? //Main Function here...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_member);
initiateViews();
searchViewCategory();
}
//initiateViews function...
private void initiateViews() {
recyclerView = findViewById(R.id.search_category_recyle_view);
mSearchView = findViewById(R.id.searchView);
addMember = findViewById(R.id.addMember);
requestQueue = Volley.newRequestQueue(this);
}
private void searchViewCategory() {
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
getData();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
}
//Get Data from Server function
public void getData()
{
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "http://alfahd.witorbit.net/api.php?search_member=a&array=1", new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObjectresponse)
{
Toast.makeText(SearchMember.this, "" + response, Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error)
{
error.printStackTrace();
dialog.dismiss();
Toast.makeText(SearchMember.this, "Error", Toast.LENGTH_SHORT).show();
}
});
request.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
requestQueue.add(request);
}
The application may be doing too much work on its main thread.
VolleyTimeOutError()
回答1:
So, At first its strongly recommended to use Volley Singleton pattern to get most out of it. My volley singleton class is this.
/**
* Created by MuhammadFaisal on 8/10/2017.
*/
public class VolleySingleton {
private static final int MAX = 2 * 1024 * 1024;
private static int MAX_SERIAL_THREAD_POOL_SIZE = 10;
private static VolleySingleton mSingletonInstance = null;
private final int MAX_CACHE_SIZE = 2 * 1024 * 1024; //2 MB
Context context = null;
private ImageLoader imageLoader;
private RequestQueue volleyRequestQueue;
private VolleySingleton(Context c)
{
RequestQueue serialRequestQueue = prepareSerialRequestQueue(c);
serialRequestQueue.start();
context = c;
volleyRequestQueue = Volley.newRequestQueue(c);
imageLoader = new ImageLoader(volleyRequestQueue, new ImageLoader.ImageCache() {
private LruCache<String, Bitmap> mCache = new LruCache<>((int) (Runtime.getRuntime().maxMemory() / 1024 / 8));
@Override
public Bitmap getBitmap(String url)
{
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap)
{
mCache.put(url, bitmap);
}
});
}
public static VolleySingleton getInstance(Context context)
{
if (mSingletonInstance == null)
{
mSingletonInstance = new VolleySingleton(context);
}
return mSingletonInstance;
}
public static RequestQueue prepareSerialRequestQueue(Context context)
{
Cache cache = new DiskBasedCache(context.getCacheDir(), MAX);
Network network = getNetwork();
RequestQueue requestQueue;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
&& Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT)
{
try
{
if (checkGooglePlayServices(context))
ProviderInstaller.installIfNeeded(context);
}
catch (GooglePlayServicesRepairableException e)
{
// Indicates that Google Play services is out of date, disabled, etc.
// Prompt the user to install/update/enable Google Play services.
GooglePlayServicesUtil.showErrorNotification(e.getConnectionStatusCode(), context);
// Notify the SyncManager that a soft error occurred.
//syncResult.stats.numIOExceptions++;
return null;
}
catch (GooglePlayServicesNotAvailableException e)
{
// Indicates a non-recoverable error; the ProviderInstaller is not able
// to install an up-to-date Provider.
// Notify the SyncManager that a hard error occurred.
//GooglePlayServicesUtil.showErrorNotification(e.getConnectionStatusCode(), context);
//syncResult.stats.numAuthExceptions++;
return null;
}
HttpStack stack = null;
try
{
stack = new HurlStack(null, new TLSSocketFactory());
}
catch (KeyManagementException e)
{
e.printStackTrace();
Log.d("Your Wrapper Class", "Could not create new stack for TLS v1.2");
stack = new HurlStack();
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
Log.d("Your Wrapper Class", "Could not create new stack for TLS v1.2");
stack = new HurlStack();
}
requestQueue = Volley.newRequestQueue(context, stack);
return requestQueue;
}
else
return new RequestQueue(cache, network, MAX_SERIAL_THREAD_POOL_SIZE);
}
private static Network getNetwork()
{
HttpStack stack;
String userAgent = "volley/0";
if (Build.VERSION.SDK_INT >= 9)
{
stack = new HurlStack();
}
else
{
stack = null;
//stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
return new BasicNetwork(stack);
}
private static boolean checkGooglePlayServices(Context con)
{
switch (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(con))
{
case ConnectionResult.SERVICE_MISSING:
Log.d("googleError: ", Integer.toString(ConnectionResult.SERVICE_MISSING));
//GoogleApiAvailability.getInstance().getErrorDialog(SplashScreen.this,ConnectionResult.SERVICE_MISSING,0).show();
break;
case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:
Log.d("googleError: ", Integer.toString(ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED));
//GoogleApiAvailability.getInstance().getErrorDialog(this,ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED,0).show();
break;
case ConnectionResult.SERVICE_DISABLED:
Log.d("googleError: ", Integer.toString(ConnectionResult.SERVICE_DISABLED));
//GoogleApiAvailability.getInstance().getErrorDialog(this,ConnectionResult.SERVICE_DISABLED,0).show();
break;
}
return true;
}
public RequestQueue getVolleyRequestQueue()
{
if (volleyRequestQueue == null)
{
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
volleyRequestQueue = Volley.newRequestQueue(context.getApplicationContext());
}
return volleyRequestQueue;
}
public ImageLoader getImageLoader()
{
return imageLoader;
}
}
there are lots of benefits in using singleton approch and one of the main is it gives you one requestqueue to do all network requests. Now, initialize your requestQueue like this:
private RequestQueue requestQueue;
if (requestQueue == null)
requestQueue = VolleySingleton.getInstance(context).getVolleyRequestQueue();
you can now start doing network calls like this and just to let you know I used this same method to call your endpoint and got a response successfully.
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, "http://alfahd.witorbit.net/api.php?search_member=a&array=1", new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response)
{
volleyCallBack.onSuccess(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error)
{
JSONObject jsonObject;
NetworkResponse networkResponse = error.networkResponse;
if (networkResponse != null && networkResponse.data != null)
{
String jsonError = new String(networkResponse.data);
if(jsonError.contains("500"))
createErrorDialog("Something went wrong. Try Later!","");
}
volleyCallBack.onFailure(error);
}
})
// {
// @Override
// public byte[] getBody()
// {
// return jsonObject.toString().getBytes();
// }
//
// @Override
// public Map<String, String> getHeaders()
// {
// Map<String, String> params = new HashMap<String, String>();
// params.put("Authorization", "Bearer " + jwt);
// params.put("Content-Type", "application/json");
// return params;
// }
// };
jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(
0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
requestQueue.add(jsonObjectRequest);
来源:https://stackoverflow.com/questions/57519650/im-facing-volley-time-out-error-and-mainthread-error