I have looked all around but can't figure out why I'm getting the error
error: method does not override or implement a method from a supertype
This highlights the two @Override
s I have in a method (subroutine?). Here's my MainActivity.java
- the part of the code it occurs in the queryBooks()
method at the end - the @Override
s are both underlined 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's position and contents
// to the console in Debug
Log.d("My Application", position + ": " + mNameList.get(position));
}
public void displayWelcome() {
// Access the device's key-value storage
mSharedPreferences = getSharedPreferences(PREFS, MODE_PRIVATE);
// Read the user's 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's 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'm following this tutorial).
Thanks for any thoughts!
The problem is what the error message is saying: "the method does not override or implement a method from a supertype". You annotated both methods with the Override annotation , however, no method with the same signature ( ie the parameters ) can be found in the supertype ( JsonHttpResponseHandler
).
If you take a look at the documentation of JsonHttpResponseHandler , you can see all the available onSuccess(...)
and onFailure(...)
methods.
Here is the working version of your code (note that 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());
}
});
Note that starting from Android 6.0 (API level 23) the Apache library (org.apache.http.*) is not available anymore. If you want to continue using that, see Behavior Changes for more information.
Some personal opinion: I wouldn't recommend using the Asynchronous HTTP Library as it's built on top of the obsolete (and from API level 23, removed) Apache HttpClient
, which has poor performance compared to HttpURLConnection
. Quote from the Android developers about HttpURLConnection
:
This API is more efficient because it reduces network use through transparent compression and response caching, and minimizes power consumption.
Easy solution to fixed above issue
Wrong code:
public class BatteryStatusPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new BatteryStatusModule(reactContext));
return modules;
}
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
Solution:
Here i just removed @override
public class BatteryStatusPackage implements ReactPackage {
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new BatteryStatusModule(reactContext));
return modules;
}
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
I am not sure which version of loopj library you are using, but from this Javadoc link , your onSuccess
and onFailure
method signatures are both different.
They have to 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) {}
Note the headers
parameter you have missed.
The tutorial you're following uses version 1.4.4 of the Asynchronous Http Client library. You're probably using another version.
Either specify this version on your Gradle configuration:
dependencies {
...
compile 'com.loopj.android:android-async-http:1.4.4'
...
}
Or change your definition to reflect the method signatures of the version you're using, 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) {
// ...
}
add a Java doc for your class, in order to override or implement super class behaviors.
Unfortunately I have no source, and thats how I cracked mine.
And the gist is that a Java doc is not just a doc, it's a tool that informs construction based matters of classes. And it passes data across for getters and setters, classes etc
It handles API matters in a form of HTML DOCUMENT.
Hope it helps some bodies. 🙂
I had this problem in this case (code is simplified):
public interface SomeInterface {
Long getField();
}
@SuperBuilder
public abstract class Parent implements SomeInterface {
private field;
@Override
public Long getField() {
return field;
}
@SuperBuilder(toBuilder = true)
public class Child extends Parent {
//some code here
}
}
I solved it by deleting "(toBuilder = true)" in Child.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.