2013-06-19 48 views
0

我想要制作一个访问RottenTomatoes.com并加载即将播放的电影的API数据的Android应用程序。Android Java编程:需要帮助创建一个对象变量

我可以成功获取API数据,但是当我尝试解析数据时遇到了麻烦。

这里的代码不工作的模块:

public class MovieJSONParser { 
    static public class MovieParser{  
     static ArrayList<Movie> parseMovie(String jsonString) throws JSONException { 

      ArrayList<Movie> movies = new ArrayList<Movie>(); 
      JSONObject moviesJSON = new JSONObject(jsonString); 
      JSONArray moviesArray = moviesJSON.getJSONArray("movies"); 
      Log.d("app", "in MovieJSONParser"); 
      for (int i = 0; i < moviesArray.length(); i++) { 
       JSONObject o = moviesArray.getJSONObject(i); 
       Log.d("app", o.toString()); 
       Log.d("app", "Created a JSON object to put in Movies"); 

           // THIS LINE ISN'T WORKING 
       Movie movie = new Movie(o);  

       Log.d("app", "after Movie declaration"); 
       movies.add(movie); 
      } 
      Log.d("app", "end of MovieJSONParser"); 
      return movies; 
     } 
    } 
} 

我知道的,我标记为不工作不工作,因为日志的评论均出现代码行是否正确,直到声明:

Movie movie = new Movie(o); 

这行代码是微不足道的......一个简单的类对象的声明......我不知道为什么它使程序崩溃......有没有实际的错误。程序运行。

这里是我的Movie.class

public class Movie extends Activity { 
    String url_posterThumbnail, title, year, mpaa_rating; 
    int critics_score; 

    public Movie(JSONObject o) throws JSONException { 
     Log.d("app", "in Movie"); 
     this.title = o.getString("title"); 
     this.year = o.getString("year"); 
     this.mpaa_rating = o.getString("mpaa_rating"); 
     this.critics_score = o.getInt("critics_score"); 
     this.url_posterThumbnail = o.getString("thumbnail"); 
    } 

    public String returnUrl_posterThumbnail() { 
     return url_posterThumbnail; 
    } 

    public void setUrl_posterThumbnail(String url_posterThumbnail) { 
     this.url_posterThumbnail = url_posterThumbnail; 
    } 

    public String returnTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String returnYear() { 
     return year; 
    } 

    public void setYear(String year) { 
     this.year = year; 
    } 

    public String returnMpaa_rating() { 
     return mpaa_rating; 
    } 

    public void setMpaa_rating(String mpaa_rating) { 
     this.mpaa_rating = mpaa_rating; 
    } 

    public int returnCritics_score() { 
     return critics_score; 
    } 

    public void setCritics_score(int critics_score) { 
     this.critics_score = critics_score; 
    } 

    @Override 
    public String toString() { 
     return "Movie [url_posterThumbnail=" + url_posterThumbnail + ", title=" 
       + title + ", year=" + year + ", mpaa_rating=" + mpaa_rating 
       + ", critics_score=" + critics_score + "]"; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_movies); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.movies, menu); 
     return true; 
    } 

} 

这里是我的情况下,MainActivity.class你需要它:

public class MainActivity extends Activity { 
    String APIKEY = "vs6hcrs57h4wy74u3zgxhmrm"; 
    String url_MY_FAVORITE_MOVIES = ""; 
    String url_BOX_OFFICE_MOVIES = "http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json?limit=3&country=us&apikey=p53b5bybwxpg7nfykwzezkzr"; 
    String url_IN_THEATRES_MOVIES = "http://api.rottentomatoes.com/api/public/v1.0/lists/movies/in_theaters.json?page_limit=3&page=1&country=us&apikey=p53b5bybwxpg7nfykwzezkzr"; 
    String url_OPENING_MOVIES = "http://api.rottentomatoes.com/api/public/v1.0/lists/movies/opening.json?limit=3&country=us&apikey=p53b5bybwxpg7nfykwzezkzr"; 
    String url_UPCOMING_MOVIES = "http://api.rottentomatoes.com/api/public/v1.0/lists/movies/upcoming.json?page_limit=3&page=1&country=us&apikey=p53b5bybwxpg7nfykwzezkzr"; 
    ListView listview; 
    ArrayList<Movie> movies = new ArrayList<Movie>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Log.d("app", "Hi! In onCreate"); 
     listview = (ListView) findViewById(R.id.listView1); 
     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1); 
     listview.setAdapter(arrayAdapter); 
     arrayAdapter.add("My Favorite Movies"); 
     arrayAdapter.add("Box Office Movies"); 
     arrayAdapter.add("In Theatres Movies"); 
     arrayAdapter.add("Opening Movies"); 
     arrayAdapter.add("Upcoming Movies"); 

     listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int listViewPosition, 
        long arg3) { 
       Intent i = new Intent(getBaseContext(), MoviesDetails.class); 

       switch (listViewPosition) { 
        case 0: 
         try { 
          movies = new GetMoviesASYNCTASK(MainActivity.this).execute(url_MY_FAVORITE_MOVIES).get(); 
         } catch (InterruptedException e1) { 
          e1.printStackTrace(); 
         } catch (ExecutionException e1) { 
          e1.printStackTrace(); 
         } 
         Log.d("app", "right before starting MoviesDetails activity"); 
         i.putExtra("movies", movies); 
         startActivity(i); 
         break; 

        case 1: 
         try { 
          movies = new GetMoviesASYNCTASK(MainActivity.this).execute(url_BOX_OFFICE_MOVIES).get(); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } catch (ExecutionException e) { 
          e.printStackTrace(); 
         } 
         Log.d("app", "right before starting MoviesDetails activity"); 
         i.putExtra("movies", movies); 
         startActivity(i); 
         break; 

        case 2: 
         try { 
          movies = new GetMoviesASYNCTASK(MainActivity.this).execute(url_IN_THEATRES_MOVIES).get(); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } catch (ExecutionException e) { 
          e.printStackTrace(); 
         } 
         Log.d("app", "right before starting MoviesDetails activity"); 
         i.putExtra("movies", movies); 
         startActivity(i); 
         break; 

        case 3: 
         try { 
          movies = new GetMoviesASYNCTASK(MainActivity.this).execute(url_OPENING_MOVIES).get(); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } catch (ExecutionException e) { 
          e.printStackTrace(); 
         } 
         Log.d("app", "right before starting MoviesDetails activity"); 
         i.putExtra("movies", movies); 
         startActivity(i); 
         break; 

        case 4: 
         try { 
          movies = new GetMoviesASYNCTASK(MainActivity.this).execute(url_UPCOMING_MOVIES).get(); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } catch (ExecutionException e) { 
          e.printStackTrace(); 
         } 
         Log.d("app", "right before starting MoviesDetails activity"); 
         i.putExtra("movies", movies); 
         startActivity(i); 
         break; 

        default: 
         break; 
       } 
       Log.d("app", "end of file?"); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

最后,这是我GetMoviesASYNCTASK.class如果你需要它:

public class GetMoviesASYNCTASK extends AsyncTask<String, Void, ArrayList<Movie>> { 
    String url_string; 
    ProgressDialog pd; 
    MainActivity main; 

    public GetMoviesASYNCTASK(MainActivity main){ 
     this.main = main; 
    } 

    @Override 
    protected ArrayList<Movie> doInBackground(String... params) { 
     url_string = params[0]; 
//  pd = new ProgressDialog(main); 
//  pd.setCancelable(false); 
//  pd.setMessage("Loading Movies...!"); 
//  pd.show(); 
     Log.d("app", "begin asynctask"); 

     try { 
      URL url = new URL(url_string);//Parse the string as an url 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      //create a http connection using that url 
      con.setRequestMethod("GET");//Use the get method 
      con.connect(); //Connect to http 
      int statusCode = con.getResponseCode();//Get the server's response 
      if (statusCode == HttpURLConnection.HTTP_OK) { //If server returns 200 
       BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 
       StringBuilder sb = new StringBuilder(); 
       String line = reader.readLine(); 
       while (line != null) { 
        sb.append(line); 
        line = reader.readLine(); 
       } 
       Log.d("app", "String value of API stored"); 
       ArrayList<Movie> movies = MovieJSONParser.MovieParser.parseMovie(sb.toString()); 
       Log.d("app", "movies in ASYNCTASK initialized :)"); 
       return movies; 
      } 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Log.d("app", "asynctask didn't work"); 
     return null; 
    } 

    // Override 
    protected void onPostExecute(ArrayList<Movie> result) { 
     //ArrayList<String> movieTitles = new ArrayList<String>(); 
     super.onPostExecute(result); 
     Log.d("app", "exiting asynctask"); 
     //pd.dismiss(); 
    } 


} 

上午我错过了明显的东西?

任何帮助将不胜感激!

+0

只是发布你的logcat跟踪,让我们知道你得到的错误是什么 – 7bluephoenix

+1

*我错过了什么明显的东西? confused * - **不要**自己实例化活动(因为'Movie'扩展了'Activity'并且你正在创建它们的列表),活动只能由系统或通过'startActivity() '电话。此外,定义*不工作*。 – Luksprog

+0

下面是我点击“Box Office Movies”时的LogCat跟踪输出: 06-19 20:58:11.076:E/Trace(1275):打开跟踪文件时出错:没有这样的文件或目录(2) 06- 19 20:59:04.716:E /跟踪(1294):错误打开跟踪文件:没有这样的文件或目录(2) –

回答

0

critics_score是在收视率对象,但在这里你试图直接访问该密钥。所以它是抛出异常。

更好地利用optString()一些默认值,而不是的getString(),因为即使键不存在,不会有例外结束..


这里是工作代码:

JSONObject object = new JSONObject(result); 
JSONArray records = object.getJSONArray("movies"); 

Log.d(LOG_TAG, "records" + records); 

int len = records.length(); 

String albumart[] = new String[len]; 

for (int i = 0; i < len; i++) { 

    JSONObject record = (JSONObject) records.getJSONObject(i); 

    String extid = record.getString("id"); 

    String accountName = record.optString("title", "No title"); 

    JSONObject posters = record.getJSONObject("posters"); 

    String albuart = posters.optString("detailed", null); 

    String critics = record.optString("critics_consensus", "No Critics"); 

    String year = record.getString("year"); 

    String rating = record.optString("mpaa_rating", "No rating"); 

    JSONObject ratings = record.getJSONObject("ratings"); 
    String rating = ratings.optString("critics_score", ""); 

    if(rating.length() <= 0) { 
     rating = "0"; 
    } 

    String audience_rating = ratings.optString("audience_rating", ""); 

    if(audience_rating.length() <= 0) { 
     audience_rating = "0"; 
    } 

    String duration = record.optString("runtime", ""); 

    if(duration.length() <= 0) { 
     duration = "0" 
    } 
}