2013-06-19 85 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" 
    } 
}