-4

下面是我的代码:

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();
            }

}

此代码适用于 SDK 8,但不适用于 17。我遇到了这个问题。这里有人知道如何调试吗?我很乐意感谢您的帮助。谢谢。

4

3 回答 3

2

自 API 11 (3.0) 起,您无法在主线程上进行网络调用。在这里阅读更多: http ://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html

于 2013-07-08T19:41:45.707 回答
1

你必须把你的代码放在AsyncTask中,我相信自从 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);

    }
}

您必须修改 readMovieSchedules() 以将 url 作为这样的参数 readMovieSchedules(url) ,我认为它会正常工作,您可以这样调用任务:

getMovieSched task = new someTask(MainActivity.this);
task.execute(url);
于 2013-07-08T19:40:58.937 回答
1

ASyncTask 是专门为这样的场景而设计的。它允许您在单独的线程中通过网络进行通信,而无需使用线程。

ASyncTask 有这些方法:

onPreExecute() :在主处理发生之前调用它......它的一种用途是启动进度对话框,通知用户事务。

doInBackground() :这是您从网络执行数据交换的地方。这里没有 UI 摆弄。

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.execute(); 在 setContentView() 之后;

于 2013-07-08T19:49:19.747 回答