Aplikacja napisana, kompiluje się poprawnie. Nie zawiera błędów składniowych, chociaż są elementy warte uwagi typu:
- W pliku FilmApiRequester.java w linijce
Api filmRequester = restAdapter.create(Api.class);
filmRequester nie jest nigdzie wykorzystywany.
Niestety po wpisaniu w EditText żądanego tytułu filmu otrzymuję komunikat "Aplikacja Rotten Tomatoes została zatrzymana". Wydaje mi się że jest to związane z wielowątkowością, albo jej brakiem. Czy ktoś widzi problem w tej aplikacji ?
MainActivity.java
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickButtonMethod(View v){
EditText editText = (EditText) findViewById(R.id.editText);
String filmTilte = editText.getText().toString();
FilmApiRequeter filmApi = new FilmApiRequeter();
filmApi.getFilms(filmTilte,"1",new Callback<Film>() {
@Override
public void success(Film film, Response response) {
onFilmGet(film);
}
@Override
public void failure(RetrofitError error) {
error.printStackTrace();
}
});
}
public void onFilmGet(Film film) {
TextView textView = new TextView(this);
textView.setText(film.getMovies()[0].getTitle());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
FilmApiRequester.java
import retrofit.Callback;
import retrofit.RestAdapter;
import retrofit.http.Query;
public class FilmApiRequeter {
private static String ROOT ="http://api.rottentomatoes.com/api/public/v1.0";
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(ROOT)
.build();
Api filmRequester = restAdapter.create(Api.class);
private String apikey="xxxxxxxxxxxxxxxxxxxx";
public void getFilms(String filmTitle,String pageLimit, Callback<Film> callback)
{
Api api = new Api() {
@Override
public void getFilmInfo(@Query("apikey") String apikey, @Query("q") String filmTitle, @Query("page_limit") String pageLimit, Callback<Film> callback) {
}
};
api.getFilmInfo(apikey,filmTitle,pageLimit,callback);
}
}
Api.java
import retrofit.Callback;
import retrofit.http.GET;
import retrofit.http.Query;
public interface Api{
@GET("/movies.json")
public void getFilmInfo(@Query("apikey") String apikey, @Query("q") String filmTitle, @Query("page_limit") String pageLimit, Callback<Film> callback);
}
Film.java
import com.google.gson.annotations.SerializedName;
public class Film {
@SerializedName("movies")
Movies[] movies;
public Movies[] getMovies() {
return movies;
}
public void setMovies(Movies[] movies) {
this.movies = movies;
}
}
Movies.java
import com.google.gson.annotations.SerializedName;
public class Movies {
@SerializedName("title")
private String title;
@SerializedName("year")
private int year;
@SerializedName("runtime")
private int runtime;
@SerializedName("synopsis")
private String synopsis;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getRuntime() {
return runtime;
}
public void setRuntime(int runtime) {
this.runtime = runtime;
}
public String getSynopsis() {
return synopsis;
}
public void setSynopsis(String synopsis) {
this.synopsis = synopsis;
}
}
Jest to kompletny program który łączę z layoutem.