A method does not override or does not implement a method from a supertype - to override

I looked around, but I can not understand why I get an error message

error: the method does not override or does not implement the method from the supertype

This highlights the two @Override that I have in the method (subroutine?). Here my MainActivity.java is the part of the code that appears in the queryBooks() method at the end - @Override , underlined in red.

 package com.example.batman.myapplication; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.support.v4.view.MenuItemCompat; //import android.support.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.ShareActionProvider; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.JsonHttpResponseHandler; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener { TextView mainTextView; EditText mainEditText; ListView mainListView; ArrayAdapter mArrayAdapter; // ArrayList<String> mNameList = new ArrayList<String>(); ArrayList mNameList = new ArrayList(); android.support.v7.widget.ShareActionProvider mShareActionProvider; // This is for internet stuff private static final String QUERY_URL = "http://openlibrary.org/search.json?q="; // Setting up the storage of data private static final String PREFS = "prefs"; private static final String PREF_NAME = "name"; SharedPreferences mSharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1. Access the TextView defined in layout XML // and then set its text mainTextView = (TextView) findViewById(R.id.main_textview); // mainTextView.setText("Set in Java!"); Button mainButton; mainButton = (Button) findViewById(R.id.main_button); mainButton.setOnClickListener(this); // 3. Access the EditText defined in layout XML mainEditText = (EditText) findViewById(R.id.main_edittext); // 4. Access the ListView mainListView = (ListView) findViewById(R.id.main_listview); // Create an ArrayAdapter for the ListView mArrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, mNameList); // Set the ListView to use the ArrayAdapter mainListView.setAdapter(mArrayAdapter); // 5. Set this activity to react to list items being pressed mainListView.setOnItemClickListener(this); // 7. Greet the user, or ask for their name if new displayWelcome(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu. // Adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); // Access the Share Item defined in menu XML MenuItem shareItem = menu.findItem(R.id.menu_item_share); // Access the object responsible for // putting together the sharing submenu if (shareItem != null) { mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); } // Create an Intent to share your content setShareIntent(); return true; } private void setShareIntent() { if (mShareActionProvider != null) { // create an Intent with the contents of the TextView Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Android Development"); shareIntent.putExtra(Intent.EXTRA_TEXT, mainTextView.getText()); // Make sure the provider knows // it should work with that Intent mShareActionProvider.setShareIntent(shareIntent); } } @Override public void onClick(View v) { // // Take what was typed into the EditText // // and use in TextView // mainTextView.setText(mainEditText.getText().toString() + "."); // // // Also add that value to the list shown in the ListView // mNameList.add(mainEditText.getText().toString()); // mArrayAdapter.notifyDataSetChanged(); // // 6. The text you'd like to share has changed, // // and you need to update // setShareIntent(); // // if(v == mainEditText) { // mainEditText.setText(""); // } // 9. Take what was typed into the EditText and use in search // (the above is commented out, per tutorial part 3 - this takes its place as input queryBooks(mainEditText.getText().toString()); // mainEditText.setText(""); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Log the item position and contents // to the console in Debug Log.d("My Application", position + ": " + mNameList.get(position)); } public void displayWelcome() { // Access the device key-value storage mSharedPreferences = getSharedPreferences(PREFS, MODE_PRIVATE); // Read the user name, // or an empty string if nothing found String name = mSharedPreferences.getString(PREF_NAME, ""); if (name.length() > 0) { // If the name is valid, display a Toast welcoming them Toast.makeText(this, "Welcome back, " + name + "!", Toast.LENGTH_LONG).show(); } else { // otherwise, show a dialog to ask for their name AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Hello!"); alert.setMessage("What is your name?"); // Create EditText for entry final EditText input = new EditText(this); alert.setView(input); // Make an "OK" button to save the name alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Grab the EditText input String inputName = input.getText().toString(); // Put it into memory (don't forget to commit!) SharedPreferences.Editor e = mSharedPreferences.edit(); e.putString(PREF_NAME, inputName); e.commit(); // Welcome the new user Toast.makeText(getApplicationContext(), "Welcome, " + inputName + "!", Toast.LENGTH_LONG).show(); } }); // Make a "Cancel" button // that simply dismisses the alert alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) {} }); alert.show(); } } // Internet stuff private void queryBooks(String searchString) { // Prepare your search string to be put in a URL // It might have reserved characters or something String urlString = ""; try { urlString = URLEncoder.encode(searchString, "UTF-8"); } catch (UnsupportedEncodingException e) { // if this fails for some reason, let the user know why e.printStackTrace(); Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } // Create a client to perform networking AsyncHttpClient client = new AsyncHttpClient(); // Have the client get a JSONArray of data // and define how to respond client.get(QUERY_URL + urlString, new JsonHttpResponseHandler() { @Override // THIS METHOD DOES NOT OVERRIDE METHOD FROM ITS SUPERCLASS ?? public void onSuccess(JSONObject jsonObject) { // Display a "Toast" message // to announce your success Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show(); // 8. For now, just log results Log.d("omg android", jsonObject.toString()); } @Override // THIS METHOD DOES NOT OVERRIDE METHOD FROM ITS SUPERCLASS ?? public void onFailure(int statusCode, Throwable throwable, JSONObject error) { // Display a "Toast" message // to announce the failure Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show(); // Log error message // to help solve any problems Log.e("omg android", statusCode + " " + throwable.getMessage()); } }); } } // end class 

(For what it's worth, I follow this tutorial).

Thanks for any thoughts!

+6
source share
3 answers

The problem is what the error message says: "the method does not override or does not implement the method from the supertype." You annotated both methods using the Override annotation , however, no method with the same signature (i.e. parameters) can be found in the supertype ( JsonHttpResponseHandler ).

If you look at the JsonHttpResponseHandler documentation, you will see all the available methods onSuccess(...) and onFailure(...) .

Here is the working version of your code (note that there are changes in the method signatures):

 client.get(QUERY_URL + urlString, new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, org.apache.http.Header[] headers, JSONObject jsonObject) { // Display a "Toast" message // to announce your success Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show(); // 8. For now, just log results Log.d("omg android", jsonObject.toString()); } @Override public void onFailure(int statusCode, org.apache.http.Header[] headers, Throwable throwable, JSONObject error) { // Display a "Toast" message // to announce the failure Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show(); // Log error message // to help solve any problems Log.e("omg android", statusCode + " " + throwable.getMessage()); } }); 

Please note that starting with Android 6.0 (API level 23), the Apache library (org.apache.http. *) Is no longer available. If you want to continue using it, see "Behavioral Changes" for more information.

Some personal opinion: I would not recommend using an asynchronous HTTP library, since it was built on top of the obsolete (and from API level 23, removed) Apache HttpClient , which has poor performance compared to HttpURLConnection . Quote from Android developers about HttpURLConnection :

This API is more efficient because it reduces network usage due to transparent compression and response caching and minimizes power consumption.

+3
source

I'm not sure which version of the loopj library you are using, but from this link, Javadoc , your onSuccess and onFailure are different.

They should be,

 @Override public void onSuccess(int statusCode, org.apache.http.Header[] headers, org.json.JSONObject response) {} @Override public void onFailure(int statusCode, org.apache.http.Header[] headers, java.lang.Throwable throwable, org.json.JSONObject errorResponse) {} 

Pay attention to the headers parameter that you skipped.

+1
source

The next tutorial uses version 1.4.4 of the asynchronous Http client library. You are probably using a different version.

Or specify this version in the Gradle configuration:

 dependencies { ... compile 'com.loopj.android:android-async-http:1.4.4' ... } 

Or change your definition to reflect the method signature of the version used, for example, for 1.4.8 (latest):

 @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { // ... } @Override public void onFailure(int statusCode, org.apache.http.Header[] headers, java.lang.Throwable throwable, org.json.JSONObject errorResponse) { // ... } 
+1
source

All Articles