Как использовать Volley вместо HttpUrlConnection для класса связи в Веб?


У меня есть следующий класс Android, с которым я манипулирую просьбами POST в API REST Laravel, эта основана в HttpUrlConnection:

import android.content.Context;
import android.net.DhcpInfo;
import android.net.wifi.WifiManager;
import android.util.Log;
import android.widget.TextView;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

public class Net {

    private HttpURLConnection urlConnection;

    public String requestString(String url, Map parameters) {
        StringBuilder result = new StringBuilder();
        try {
            URL finalurl = new URL(url);

            urlConnection = (HttpURLConnection) finalurl.openConnection();
            urlConnection.setReadTimeout(10000);
            urlConnection.setConnectTimeout(15000);
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoInput(true);

            if (parameters != null) {
                urlConnection.setDoOutput(true);
                writeOutput(urlConnection, (HashMap) parameters);
            }


            writeInput(urlConnection, result);

            urlConnection.disconnect();
        } catch (Exception e) {
            System.out.println("Error" + e);
        }

        Log.i("httpResponse", result.toString());

        return result.toString();
    }

    private void writeOutput(HttpURLConnection conn, HashMap postDataParams) throws IOException {
        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getPostDataString(postDataParams));

        writer.flush();
        writer.close();
        os.close();
    }

    private void writeInput(HttpURLConnection conn, StringBuilder strb) throws IOException {
        InputStream in = new BufferedInputStream(conn.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        String line;
        while ((line = reader.readLine()) != null) {
            strb.append(line);
        }
    }

    private String getPostDataString(HashMap params) throws UnsupportedEncodingException {
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry entry : params.entrySet()) {
            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }

        return result.toString();
    }

    public static void logNetInformation(Context c) {
        WifiManager wifii;
        DhcpInfo d;
        String s_dns1;
        String s_dns2;
        String s_gateway;
        String s_ipAddress;
        String s_leaseDuration;
        String s_netmask;
        String s_serverAddress;
        TextView info;

        wifii = (WifiManager) c.getSystemService(Context.WIFI_SERVICE);
        d = wifii.getDhcpInfo();

        s_dns1 = "DNS 1: " + String.valueOf(d.dns1);
        s_dns2 = "DNS 2: " + String.valueOf(d.dns2);
        s_gateway = "Default Gateway: " + String.valueOf(d.gateway);
        s_ipAddress = "IP Address: " + String.valueOf(d.ipAddress);
        s_leaseDuration = "Lease Time: " + String.valueOf(d.leaseDuration);
        s_netmask = "Subnet Mask: " + String.valueOf(d.netmask);
        s_serverAddress = "Server IP: " + String.valueOf(d.serverAddress);

        Log.i("Network Info", s_dns1 + "\n" + s_dns2 + "\n" + s_gateway + "\n" + s_ipAddress + "\n" + s_leaseDuration + "\n" + s_netmask + "\n" + s_serverAddress);
    }

    static public String intToIp(int addr) {
        return ((addr & 0xFF) + "." +
                ((addr >>>= 8) & 0xFF) + "." +
                ((addr >>>= 8) & 0xFF) + "." +
                ((addr >>>= 8) & 0xFF));
    }
}

Но недавно услышьте Volley и я осведомлялся, каковыми были различия, более специально он: Я должен использовать Volley вместо HttpUrlConnection чтобы манипулировать просьбами Http, из-за которых? Также мне хотелось бы знать, как осуществляется точно та же функциональность, которая поставляет код вверх, но в Volley.

Спасибо.

6
задан 22.12.2016, 03:27
3 ответа

Volley НЕ estÃ: в неупотребительности

В одном из ответов укрепляется следующее:

Следует отметить, что volley эта в неупотребительности, из-за которого я понимаю, и сейчас использует HttpUrlConnection

Creo, что, когда мы утвердим вещи этого типа ser¦, - чтобы лучше документировать afirmaci¦n. Volley не estÃ: в неупотребительности, всем противоположности, она вынесена, документируется и рекомендуется Google, чтобы сделать просьбы прежде всего, если они не являются очень тяжелыми .

Преимущества Volley

у Según Google, Volley есть серия совсем не презренных преимуществ, между ними:

  • конкурирующая Обработка просьб múltiples.
  • Priorizaci¦n просьб, что позволяет определять преобладание каждого petici¦n.
  • Cancelaci¦n просьб, предотвращая presentaci¦n нежелательных результатов в главном трэде.
  • Gesti¦n automÃ: костариканская работы на втором плане, оставляя в стороне ручной implementaci¦n framework трэдов.
  • Implementaci¦n caché к диску и памяти.
  • Способность personalizaci¦n просьб.
  • Снабжает informaci¦n подробно описанная состояния и разгрузки работы просьб в консоли depuraci¦n.

Избегать использовать Volley в разрядах тяжелых данных

, Хотя Volley обладает огромными преимуществами для обработки просьб, он не значит, что нужно использовать в каждом petici¦n, который мы сделали. Этот librer¦ - в tiene ограничения с разрядом слишком много пространного informaci¦n, так как Ваш operaci¦n основывается на пропусках в caché, что har¦ - в медленный процесс с объемными данными.

Пример c¦digo

Мы Оценим простоту и ясность использования Volley:

Для заданий, поскольку получать json с Веб услуги Volley предлагает огромные возможности с небольшим количеством l¦-neas c¦digo.

Aquà - пример pÃ: gina Google для petici¦n JSON:

TextView mTxtDisplay;
ImageView mImageView;
mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
String url = "http://my-json-feed";

JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        mTxtDisplay.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub

    }
});

// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);

Combinaci¦n с другими librer¦-схвати

Помимо уже сказанного, Volley открывает широкий веер возможностей, когда мы она сочетаем с другими librer¦-туз, как GSON, для управления, полностью ориентируемого на объекты наших ответов JSON, полученных с Веб услуги.

Patr¦n singleton, чтобы предотвращать использование очередей conexi¦n

, Если наш aplicaci¦n делает постоянное использование Интернета или нуждается в том, чтобы реализовать просьбы на протяжении всей Вашей активности и компонентов. Этот situaci¦n har¦, - которые много программистов признают очередями просьб из-за всех сторон, или даже происходить как parÃ: метр очередь между классами, что становится повторным, мало работоспособным и смущенным.

, Чтобы демонтировать этот сложный подход, с Volley Google предлагает возможность и рекомендует создавать Патран Синглтона, который герметизировал в корпусе бы необходимую функциональность Volley. Этот patr¦n характеризуется тем, что ограничивает достижение класса единственным объектом, а именно, одинокий может существовать единственный контролирующий объект, который представлял бы существование класса, ограничивая instanciaci¦n новых элементов.

С этим soluci¦n, singleton serÃ: вездесущий во всем проекте Android и podrÃ: n использовать функциональность в любом месте. BÃ: sicamente этот класс должен содержать как признак очередь просьб и контекст aplicaci¦n (глаз, не контекст активности, так как необходимо устанавливать независимость интерфейса, если в algún момент существует изменение configuraci¦n, как rotaci¦n экрана).

, Если наш aplicaci¦n делает пунктуальные связи в сеть не ser¦ - в необходимый осуществлять выражение patr¦n.

Шрифта:

1
ответ дан 24.11.2019, 11:54
  • 1
    Но покрутив устройство, ссылка активности теряется и volley ты можешь разгружать на втором плане дату, которая не является такой легкой возвращать не? и отдача здесь есть benchmark instructure.github.io / blog / 2013/12/09/volley-vs-retrofit – Webserveis 25.04.2017, 13:07
  • 2
    @Webserveis Интересный то, что ты говоришь. ¿ Ты знаешь, есть ли какой-то способ это предотвращать используя Volley? Хотя не sé если это мой telé телефонная трубка, или который Android изменил на это, потому что в самом деле в моем устройстве ocurrí в который, взяв содержание отдаленного сервера, давно загружал снова все данные , отправив экран, но с má s или меньше в одном месяце уже он это не делает, но он меняет экран и отправляет содержание. Ло sé потому что в части, которая загружает содержание с сети, у меня есть Dialog, чтобы показывать, что подождал и сейчас этот Dialog не засолил, отправив экран. – A. Cedano 25.04.2017, 13:17

доказательство с

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private static final String REGISTER_URL = "http://estoesunserver.com/UserRegistration/volleyRegister.php";

public static final String KEY_USERNAME = "username";
public static final String KEY_PASSWORD = "password";
public static final String KEY_EMAIL = "email";


private EditText editTextUsername;
private EditText editTextEmail;
private EditText editTextPassword;

private Button buttonRegister;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editTextUsername = (EditText) findViewById(R.id.editTextUsername);
    editTextPassword = (EditText) findViewById(R.id.editTextPassword);
    editTextEmail= (EditText) findViewById(R.id.editTextEmail);

    buttonRegister = (Button) findViewById(R.id.buttonRegister);

    buttonRegister.setOnClickListener(this);
}

private void registerUser(){
    final String username = editTextUsername.getText().toString().trim();
    final String password = editTextPassword.getText().toString().trim();
    final String email = editTextEmail.getText().toString().trim();

    StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
                }
            }){
        @Override
        protected Map<String,String> getParams(){
            Map<String,String> params = new HashMap<String, String>();
            params.put(KEY_USERNAME,username);
            params.put(KEY_PASSWORD,password);
            params.put(KEY_EMAIL, email);
            return params;
        }

    };

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}

@Override
public void onClick(View v) {
    if(v == buttonRegister){
        registerUser();
    }
}

}

Следует отметить, что volley эта в неупотребительности, из-за которого я понимаю, и сейчас используются HttpUrlConnection типов привета

0
ответ дан 24.11.2019, 11:54
  • 1
    Fijece, которого один " String Request" в этом случае сервер ждет string, есть другие случаи, в которых request - типа JSON – Maguz 22.12.2016, 14:13

Ты это оставил Volley, который я использую, он cortito!

 public void onClick(View v) {

    RequestQueue cola = Volley.newRequestQueue(this);

    String url = "TU URL";

    final StringRequest stringRequest = new StringRequest
(Request.Method.POST, url, new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {

                //Te devuelve el parametro    response 
                // En este se encuentra todo lo que te devuelve

                TextView.setText(response);

            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

            System.out.println("ERROR RESPONSE");
        }
    });
    cola.add(stringRequest);}
0
ответ дан 24.11.2019, 11:54