Cómo detener HttpURLConnection.getInputStream ()?
A continuación se muestra mi código:
private HttpURLConnection connection; private InputStream is; public void upload() { try { URL url = new URL(URLPath); connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(30000); connection.setReadTimeout(30000); connection.setDoInput(true); connection.setUseCaches(false); connection.connect(); is = connection.getInputStream(); } catch (Exception e) { e.printStackTrace(); } } public void stopupload() { connection = null; is = null; }
Cuando cargue el archivo, la línea is = connection.getInputStream();
Pasará mucho tiempo para obtener respuesta. Así que quiero implementar una función de detención como stopupload()
. Pero si llamo stopupload()
mientras que el código está manejando en la línea is = connection.getInputStream();
, Todavía necesita esperar su respuesta.
- ¿Cómo eliminar el permiso específico al crear una aplicación para Android con gradle?
- Envío de DateTimeOffset desde Android a .NET Web API
- Android Okhttp llamadas asincrónicas
- El método non-static execute () no se puede referenciar desde un contexto estático
- Módulo o proyecto de importación como Biblioteca en Android Studio
Quiero dejar de esperar al mismo tiempo implementar stopupload()
. ¿Cómo puedo hacerlo?
- Cómo volver a lanzar una excepción
- ¿Cómo utilizar textview en la pantalla de Preferencias de Android?
- Cargador de clases personalizado para android?
- VideoView no reproduce video o audio en RecyclerView
- ¿Cómo puedo usar Android con Java y un núcleo hecho con Scala?
- ¿Cómo obtener eficientemente una matriz corta de recursos en Android?
- Obtener la dirección IP del equipo en un proyecto de Android utilizando java
- Org.json.JSONException: Objeto no terminado en el carácter 14
Pero si llamo
stopupload()
mientras que el código está manejando en la líneais = connection.getInputStream();
, Todavía necesita esperar su respuesta.
A partir de HoneyComb , no se permite ejecutar todas las operaciones de red en el subproceso principal. Para evitar obtener NetworkOnMainThreadException , puede utilizar Thread
o AsyncTask
.
Quiero dejar de esperar al mismo tiempo implementar stopupload (). ¿Cómo puedo hacerlo?
Debajo del código le da al usuario que deje de subir después de 2 segundos, pero puede modificar los tiempos de suspensión (debe ser menos de 5 segundos) en consecuencia.
Subir
public void upload() { try { URL url = new URL(URLPath); connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(30000); connection.setReadTimeout(30000); connection.setDoInput(true); connection.setUseCaches(false); connection.connect(); // run uploading activity within a Thread Thread t = new Thread() { public void run() { is = connection.getInputStream(); if (is == null) { throw new RuntimeException("stream is null"); } // sleep 2 seconds before "stop uploading" button appears mHandler.postDelayed(new Runnable() { public void run() { mBtnStop.setVisibility(View.VISIBLE); } }, 2000); } }; t.start(); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { } } if (connection != null) { connection.disconnect(); } } }
OnCreate:
@Override public void onCreate(Bundle savedInstanceState) { // more codes... Handler mHandler = new Handler(); mBtnStop = (Button) findViewById(R.id.btn_stop); mBtnStop.setBackgroundResource(R.drawable.stop_upload); mBtnStop.setOnClickListener(mHandlerStop); mBtnStop.setVisibility(View.INVISIBLE); View.OnClickListener mHandlerStop = new View.OnClickListener() { @Override public void onClick(View v) { stopUpload(); // called when "stop upload" button is clicked } }; // more codes... }
private HttpURLConnection connection; private InputStream is; public void upload() { try { URL url = new URL(URLPath); connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(30000); connection.setReadTimeout(30000); connection.setDoInput(true); connection.setUseCaches(false); connection.connect(); Thread t = new Thread() { public void run() { is = connection.getInputStream(); } }; t.start() } catch (Exception e) { e.printStackTrace(); }catch (InterruptedException e) { stopupload(connection ,is, t); } } public void stopupload(HttpURLConnection connection ,InputStream is,Thread t) { if(connection != null ){ try { t.interupt(); running = false; connection=null; is=null; } catch (Exception e) { } } }
Envuelva el código que utiliza HttpURLConnection
dentro de un Future
, como se describe aquí .
- Salida de un carácter por dos teclas en el teclado de Android
- Configuración twitter sdk tela para cordova plugin