Ответ 1
Но если я вызываю
stopupload()
, пока код обрабатывает строкуis = connection.getInputStream();
, ему все равно нужно ждать ответа.
Начиная с HoneyComb, все сетевые операции запрещены для основного потока. Чтобы избежать получения NetworkOnMainThreadException, вы можете использовать Thread
или AsyncTask
.
Я хочу остановить ожидание сразу при реализации stopupload(). Как я могу сделать это?
Ниже код дает пользователю прекратить загрузку через 2 секунды, но вы можете соответственно изменить время сна (должно быть меньше 5 секунд).
загрузки
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...
}