主方法上的android.os.networkexception
下面是我的代码:主方法上的android.os.networkexception,android,Android,下面是我的代码: private static final String TAG_TYPE = "movie_type"; private static final String TAG_NAME = "movie_name"; private static final String TAG_LENGTH = "movie_length"; private static final String TAG_SCHEDULES = "movie_schedules"; private static
private static final String TAG_TYPE = "movie_type";
private static final String TAG_NAME = "movie_name";
private static final String TAG_LENGTH = "movie_length";
private static final String TAG_SCHEDULES = "movie_schedules";
private static final String TAG_CINEMA = "movie_cinema_number";
private static final String TAG_URL = "movie_image_url";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
String readMovieSchedules = readMovieSchedules();
// Hashmap for ListView
ArrayList<HashMap<String, String>> movieList = new ArrayList<HashMap<String, String>>();
JSONArray jsonArray = new JSONArray(readMovieSchedules);
Log.i(MainActivity.class.getName(),
"Number of entries " + jsonArray.length());
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.i(MainActivity.class.getName(), jsonObject.getString("movie_name"));
// Storing each json item in variable
String name = jsonObject.getString(TAG_NAME);
String type = jsonObject.getString(TAG_TYPE);
String length = jsonObject.getString(TAG_LENGTH);
String cinema = jsonObject.getString(TAG_CINEMA);
String schedules = jsonObject.getString(TAG_SCHEDULES);
String url = jsonObject.getString(TAG_URL);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_NAME, name);
map.put(TAG_TYPE, type);
map.put(TAG_LENGTH, length);
map.put(TAG_CINEMA, cinema);
map.put(TAG_SCHEDULES, schedules);
map.put(TAG_URL, url);
// adding HashList to ArrayList
movieList.add(map);
//String strURL = TAG_URL.replaceAll(" ", "%20");
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(MainActivity.this, movieList,
R.layout.list_item,
new String[] { TAG_NAME, TAG_CINEMA, TAG_SCHEDULES },
new int[] { R.id.name, R.id.cinema, R.id.schedules });
//new String[] {},
//new int[] {});
setListAdapter(adapter);
// selecting single ListView item
ListView lv = getListView();
// Launching new screen on Selecting Single ListItem
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
String cost = ((TextView) view.findViewById(R.id.cinema)).getText().toString();
String description = ((TextView) view.findViewById(R.id.schedules)).getText().toString();
//String url = ((TextView) view.findViewById(R.id.image_)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra(TAG_NAME, name);
in.putExtra(TAG_CINEMA, cost);
in.putExtra(TAG_SCHEDULES, description);
//in.putExtra(TAG_URL, url);
startActivity(in);
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static final String TAG\u TYPE=“movie\u TYPE”;
私有静态最终字符串TAG_NAME=“movie_NAME”;
私有静态最终字符串标记_LENGTH=“movie_LENGTH”;
私有静态最终字符串TAG_SCHEDULES=“movie_SCHEDULES”;
私有静态最终字符串TAG\u CINEMA=“movie\u CINEMA\u number”;
私有静态最终字符串标记\u URL=“movie\u image\u URL”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
试一试{
字符串readMovieSchedules=readMovieSchedules();
//ListView的Hashmap
ArrayList movieList=新的ArrayList();
JSONArray JSONArray=新JSONArray(readMovieSchedules);
Log.i(MainActivity.class.getName(),
“条目数”+jsonArray.length());
for(int i=0;ivalue
地图放置(标签名称、名称);
地图放置(标签类型,类型);
地图放置(标签长度、长度);
地图放置(TAG_电影院、电影院);
地图放置(标签、时间表、时间表);
map.put(TAG_URL,URL);
//将哈希列表添加到ArrayList
movieList.add(地图);
//String strURL=TAG_URL.replaceAll(“,“%20”);
/**
*将解析的JSON数据更新到ListView中
* */
ListAdapter=new SimpleAdapter(MainActivity.this,movieList,
R.layout.list_项目,
新字符串[]{TAG_NAME,TAG_CINEMA,TAG_SCHEDULES},
新int[]{R.id.name,R.id.cinema,R.id.schedules});
//新字符串[]{},
//新int[]{});
setListAdapter(适配器);
//选择单个ListView项
ListView lv=getListView();
//在选择单个列表项时启动新屏幕
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//从选定的ListItem获取值
字符串名称=((TextView)view.findviewbyd(R.id.name)).getText().toString();
字符串成本=((TextView)view.findViewById(R.id.cinema)).getText().toString();
字符串描述=((TextView)view.findViewById(R.id.schedules)).getText().toString();
//字符串url=((TextView)view.findViewById(R.id.image))).getText().toString();
//开始新的意图
Intent in=新的Intent(getApplicationContext(),SingleMenuItemActivity.class);
in.putExtra(标签名称、名称);
in.putExtra(TAG_电影院,成本);
in.putExtra(标签清单、说明);
//in.putExtra(标记URL、URL);
星触觉(in);
}
});
}
}捕获(例外e){
e、 printStackTrace();
}
}
此代码适用于SDK 8,但不适用于SDK 17。我被这个问题困住了。这里有人知道如何调试这个吗?我非常感谢你的帮助。谢谢。您必须将代码放在一个主UI线程中,我认为从API 14开始,禁止在主UI线程上下载任何内容 应该是这样的:
public class someTask extends AsyncTask<String, Void, String> {
public MainActivity activity;
public someTask(MainActivity a)
{
activity = a;
}
@Override
protected String doInBackground(String... urls) {
String stringtoparse=null;
for (String url : urls) {
stringtoparse= readMovieSchedules(url); // getting XML from URL
}
return stringtoparse;
}
@Override
protected void onPreExecute(){
}
@Override
protected void onPostExecute(String readMovieSchedules) {
// Hashmap for ListView
ArrayList<HashMap<String, String>> movieList = new ArrayList<HashMap<String, String>>();
JSONArray jsonArray = new JSONArray(readMovieSchedules);
Log.i(MainActivity.class.getName(),
"Number of entries " + jsonArray.length());
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.i(MainActivity.class.getName(), jsonObject.getString("movie_name"));
// Storing each json item in variable
String name = jsonObject.getString(TAG_NAME);
String type = jsonObject.getString(TAG_TYPE);
String length = jsonObject.getString(TAG_LENGTH);
String cinema = jsonObject.getString(TAG_CINEMA);
String schedules = jsonObject.getString(TAG_SCHEDULES);
String url = jsonObject.getString(TAG_URL);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_NAME, name);
map.put(TAG_TYPE, type);
map.put(TAG_LENGTH, length);
map.put(TAG_CINEMA, cinema);
map.put(TAG_SCHEDULES, schedules);
map.put(TAG_URL, url);
// adding HashList to ArrayList
movieList.add(map);
}
}
getMovieSched task = new someTask(MainActivity.this);
task.execute(url);
自API 11(3.0)以来,您不能在主线程上进行网络调用。请在此处阅读更多信息:
ASyncTask是专门为此类场景而设计的。它允许您在一个单独的线程中通过网络进行通信,而无需使用线程 ASyncTask具有以下方法: onPreExecute():这是在主处理发生之前调用的。。。它的一个用途是启动进度对话框,通知用户事务 doInBackground():这是从网络执行数据交换的地方。这里没有用户界面摆弄 onProgressUpdate():可用于通知事务的进度 onPostExecute():关闭progressDialogs/bars并从获取的数据更新视图 另一个解决方案是使用runOnUiThread(),但不鼓励这样做
class nwthread extends AsyncTask<Void,Void,Void>
{
@Override
protected void onPreExecute() {
//progress dialog invoke ( notifies the user about whats going on better than making them stare on a blank screen)
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
//make http request/parse json here
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//dismiss progress dialog
// update the UI here ... ie declare adapters / bind them, update other views
}
}
类nwthread扩展异步任务
{
@凌驾
受保护的void onPreExecute(){
//进度对话框调用(通知用户发生了什么,比让他们盯着空白屏幕看要好)
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
//在此处进行http请求/解析json
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
//关闭进度对话框
//在此处更新UI…即声明适配器/绑定它们,更新其他视图