Android 网络处于AsyncTask和NetworkOnMainThreadException错误中
我想从远程数据库获取一些数据,我的活动的AsyncTask子类中有一些网络,但当我尝试加载我的程序时,它显示NetworkOnMainThreadException 这是我的密码:Android 网络处于AsyncTask和NetworkOnMainThreadException错误中,android,android-asynctask,android-networking,Android,Android Asynctask,Android Networking,我想从远程数据库获取一些数据,我的活动的AsyncTask子类中有一些网络,但当我尝试加载我的程序时,它显示NetworkOnMainThreadException 这是我的密码: public class MyMapLocationActivity extends MapActivity { private MapView mapView; private static String url_product_details = "http://myurl.com/readfromdb"; p
public class MyMapLocationActivity extends MapActivity {
private MapView mapView;
private static String url_product_details = "http://myurl.com/readfromdb";
private static final String TAG_SUCCESS = "success";
private static final String TAG_LATITUDE = "latitude";
private static final String TAG_LONGITUDE = "longitude";
private static final String TAG_POINT = "point";
JSONParser jsonParser = new JSONParser();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
ReadLocations Read = new ReadLocations();
Read.execute();
}
//And my networking AsyncTask:
class ReadLocations extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... args) {
Log.d("debug", "START DOINBACKGROUND");
runOnUiThread(new Runnable() {
public void run() {
// Check for success tag
int success;
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "16"));
// getting product details by making HTTP request
// Note that product details url will use GET request
Log.d("debug", "before http request");
JSONObject json = jsonParser.makeHttpRequest(
url_product_details, "POST", params);
Log.d("debug", "after http request");
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
JSONArray productObj = json
.getJSONArray(TAG_POINT); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
}else{
// product with pid not found
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return null;
}
@Override
protected void onPostExecute(String text) {
// dismiss the dialog once done
Log.d("debug", "ONPOSTEXECUTE");
}
公共类MyMapLocationActivity扩展了MapActivity{
私有地图视图;
私有静态字符串url\u产品\u详细信息=”http://myurl.com/readfromdb";
私有静态最终字符串标记_SUCCESS=“SUCCESS”;
私有静态最终字符串标记_LATITUDE=“LATITUDE”;
私有静态最终字符串标记_LONGITUDE=“LONGITUDE”;
私有静态最终字符串标记_POINT=“POINT”;
JSONParser JSONParser=新的JSONParser();
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView=(mapView)findViewById(R.id.mapView);
mapView.SetBuilTinZoomControl(真);
ReadLocations Read=新的ReadLocations();
Read.execute();
}
//以及我的网络任务:
类ReadLocations扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…args){
Log.d(“调试”,“启动DOINBACKGROUND”);
runOnUiThread(新的Runnable(){
公开募捐{
//检查成功标签
成功;
试一试{
//建筑参数
List params=new ArrayList();
参数添加(新的BasicNameValuePair(“id”,“16”));
//通过发出HTTP请求获取产品详细信息
//请注意,产品详细信息url将使用GET请求
Log.d(“调试”,“在http请求之前”);
JSONObject json=jsonParser.makeHttpRequest(
url_产品_详细信息,“发布”,参数);
Log.d(“调试”,“http请求后”);
//json成功标记
success=json.getInt(TAG_success);
如果(成功==1){
//已成功接收产品详细信息
JSONArray productObj=json
.getJSONArray(标记点);//JSON数组
//从JSON数组中获取第一个产品对象
JSONObject product=productObj.getJSONObject(0);
}否则{
//找不到具有pid的产品
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
});
返回null;
}
@凌驾
受保护的void onPostExecute(字符串文本){
//完成后关闭对话框
Log.d(“调试”、“ONPOSTEXECUTE”);
}
LogCat显示“在http请求之前”,但不显示我的“在http请求之后”检查
有什么问题吗?您的网络代码位于应用程序的mainuthread上,不在工作线程中 除去
runOnUiThread(new Runnable() {
public void run() {
从doInBackground()
并将WebRequest代码仅放在AsyncTask的doInBackground()
中
更新:
实际上,您对
doInBackground()
的AsyncTask实现是错误的。因为doInBackground()
在工作线程中运行,执行冗长且与网络相关的操作。您正试图运行MainUiThread使用runOnUiThread()形成它
这不在规则中。如果您想让任何与UI相关的工作在onPostExecute()
、onPreExecute()
和其他异步任务方法中完成。您的网络代码在应用程序的mainuthread上,而不是在工作线程中
除去
runOnUiThread(new Runnable() {
public void run() {
从doInBackground()
并将WebRequest代码仅放在AsyncTask的doInBackground()
中
更新:
实际上,您对
doInBackground()
的AsyncTask实现是错误的。因为doInBackground()
在工作线程中运行,执行冗长且与网络相关的操作。您正试图运行MainUiThread使用runOnUiThread()形成它
这不在规则中。如果您想使任何与UI相关的工作在onPostExecute()
,onPreExecute()中完成
和其他异步任务方法。这是因为您在UI线程上运行网络代码…您的doInBackground
在UI线程上显式运行网络代码。这是因为您在UI线程上运行网络代码…您的doInBackground
在UI线程上显式运行网络代码 试试这个代码:
@Override
protected String doInBackground(String... args) {
Log.d("debug", "START DOINBACKGROUND");
// Check for success tag
int success;
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "16"));
// getting product details by making HTTP request
// Note that product details url will use GET request
Log.d("debug", "before http request");
JSONObject json = jsonParser.makeHttpRequest(
url_product_details, "POST", params);
Log.d("debug", "after http request");
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
JSONArray productObj = json
.getJSONArray(TAG_POINT); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
}else{
// product with pid not found
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@覆盖
受保护的字符串doInBackground(字符串…args){
Log.d(“调试”,“启动DOINBACKGROUND”);
//检查成功标签
成功;
试一试{
//建筑参数
List params=new ArrayList();
参数添加(新的BasicNameValuePair(“id”,“16”));
//通过发出HTTP请求获取产品详细信息
//请注意,产品详细信息url将使用GET请求
Log.d(“调试”,“在http请求之前”);
JSONObject json=jsonParser.makeHttpRequest(
url_产品_详细信息,“发布”,参数);
Log.d(“调试”,“http请求后”);
//json成功标记
success=json.getInt(TAG_success);
如果(成功==1){
//已成功接收产品详细信息
JSONArray productObj=json
.getJSONArray(标记点);//JSON数组
//从JSON数组中获取第一个产品对象
JSONObject product=productObj.getJSONObject(0);
}否则{
//找不到具有pid的产品