Как избежать исключения сети в главном потоке, если я уже использую AsyncTask?
Мне кажется, я на самом деле не вызываю URL, сетевые операции прямо из MainActivity.
- Я вызываю url.connect() в другом классе ProcessData
- Я использую doInBackground()
- Я расширяю класс ProcessData с помощью AsyncTask
но исключение по-прежнему происходит:
public class MainActivity extends ActionBarActivity {
private final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProcessData test = new ProcessData();
test.doInBackground("mysql") ;
}
//separate file ProcessData.java
public class ProcessData extends AsyncTask<String, Void, String> {
public String createValidUrl(String s){
.....//code in this method works fine
}
public String doInBackground(String ...params){
String validUrl = createValidURL(params[0]);
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
URL url = new URL(validUrl);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
urlConnection.disconnect();
reader.close();
return buffer.toString();
}
}
Исключение из основного потока сети по-прежнему происходит, я прочитал другие сообщения SO. Я могу обернуть мой http-код подключения в новую ветку, но я хочу найти именно то, что не так
2 ответа
Решение
Вы должны позвонить
test.execute();
вместо
test.doInBackground("mysql") ;
Вы должны позвонить execute
метод на AsyncTask
для того, чтобы запустить его в фоновом потоке. То, что вы делаете, звонит doInBackground
прямо из основного потока.