如果我已经使用 AsyncTask,如何避免主线程上的网络异常?
How do I avoid network on main thread exception if I already use AsyncTask?
在我看来,我并不是真的从 MainActivity 调用 URL 网络操作 。
- 我确实在另一个 class ProcessData
中调用了 url.connect()
- 我确实使用 doInBackground()
- 我确实用 AsyncTask
扩展了 ProcessData class
但还是出现异常:
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 连接代码包装到新线程中,但我想找出到底出了什么问题
您必须在 AsyncTask
上调用 execute
方法才能在后台线程中 运行 它。您正在做的是直接从主线程调用 doInBackground
。
你得打电话
test.execute();
而不是
test.doInBackground("mysql") ;
在我看来,我并不是真的从 MainActivity 调用 URL 网络操作 。
- 我确实在另一个 class ProcessData 中调用了 url.connect()
- 我确实使用 doInBackground()
- 我确实用 AsyncTask 扩展了 ProcessData class
但还是出现异常:
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 连接代码包装到新线程中,但我想找出到底出了什么问题
您必须在 AsyncTask
上调用 execute
方法才能在后台线程中 运行 它。您正在做的是直接从主线程调用 doInBackground
。
你得打电话
test.execute();
而不是
test.doInBackground("mysql") ;