且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

我面临排球超时错误和mainThread错误

更新时间:2023-01-03 13:32:20

因此,一开始强烈建议使用Volley Singleton模式以充分利用它.我的凌空单身班是这个.

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

使用单例方式有很多好处,主要之一是它为您提供了一个请求队列来执行所有网络请求. 现在,像这样初始化您的requestQueue:

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