实现接口和创建接口实例之间的区别

时间:2016-06-02 15:28:40

标签: android android-service

我想知道实现接口和创建它的实例有什么区别,这里是一个代码示例,这段代码允许使用ResultReceiver在IntentService和Activity之间进行通信。

MySimpleReceiver类

public class MySimpleReceiver extends ResultReceiver {

public static final Creator CREATOR = null;
private Receiver receiver;

// Constructor takes a handler
public MySimpleReceiver(Handler handler) {
    super(handler);
}

// Setter for assigning the receiver
public void setReceiver(Receiver receiver) {
    this.receiver = receiver;
}

// Defines our event interface for communication
public interface Receiver {
    void onReceiveResult(int resultCode, Bundle resultData);
}

// Delegate method which passes the result to the receiver if the receiver
// has been assigned
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
    if (receiver != null) {
        receiver.onReceiveResult(resultCode, resultData);
    }
}
}

这是从服务接收数据时设置回调的最佳方法:

在MainActivity中实施MySimpleReceiver.Receiver接口:

public class MainActivity extends Activity implements MySimpleReceiver.Receiver 

    {

        @Override
        public void onReceiveResult(int resultCode, Bundle resultData) {
            //
        }
    }

或在MainActivity中创建界面实例:

public class MainActivity extends Activity {


    public MySimpleReceiver receiverForSimple;


    // Setup the callback for when data is received from the service
    public void setupServiceReceiver() {
        receiverForSimple = new MySimpleReceiver(new Handler());
        // This is where we specify what happens when data is received from the
        // service
        receiverForSimple.setReceiver(new MySimpleReceiver.Receiver() {
            @Override
            public void onReceiveResult(int resultCode, Bundle resultData) {
                if (resultCode == RESULT_OK) {
                    String resultValue = resultData.getString("resultValue");
                    Toast.makeText(MainActivity.this, resultValue, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

}

和有什么区别?感谢

2 个答案:

答案 0 :(得分:3)

你不能"创建一个实例"接口,只是实现它的类的实例。

接口只不过是一个严格约束的合同,你必须完全实现它。

一个类是一个已实现的功能。

您提供的示例显示您在匿名类中重写了MySimpleReceiver.Receiver。看起来你正在实例化一个界面,但事实并非如此。此类没有名称(因此是匿名的),但其实现包含在新语句后面的大括号中。

匿名类非常有用,但难以阅读,特别是如果您习惯使用旧版本的Java或其他不支持此类代码的语言。

请参阅the tutorial on anonymous classes here

如果您想以任何方式重用类,您将使用第一个示例(直接实现)。它使你的解决方案有点大。

第二个例子很棒,如果您只使用一次并且不希望解决方案中的类文件数量激增。

答案 1 :(得分:0)

您无法创建界面实例。 您只能创建实现该接口的类实例。 示例:

interface Calculate{
    void doCalculation();
}

class Sample implements Calculate{
   @Override
   void doCalculation(){
   //TODO Write your code to calculate
  }
}

// // =======================================

Calculate calculate = new Sample();
calculate.doCalculation();