我有一个片段,它在MainActivity中使用,实际上它在MainActivity中的ViewPager中使用。
public class Myfragment extends Fragment implements MySingleton.ResponseInterface{
public static Myfragment newInstance() {
final Myfragment mf = new Myfragment();
return mf;
}
public Myfragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
//.....
final MySingleton mysingleton = MySingleton.getInstance(getContext());
//I have a button in the fragment that I use like this
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mysingleton.getSomeResponse();
}
});
}
@Override
public void onResponseGiven(String response) {
Log.d("response", response);
}
}
我有一个Singleton类用于不同的动作,单例包括一个接口:
public class MySingleton{
private static MySingleton mInstance;
private static Context mContext;
public ResponseInterface responseInterface;
private MySingleton(Context context){
mContext = context;
this.responseInterface = (ResponseInterface) context;
}
public static synchronized MySingleton getInstance(Context context){
if(mInstance == null){
mInstance = new MySingleton(context);
}
return mInstance;
}
public void getSomeResponse(){
responseInterface.onResponseGiven("send response");
}
public interface ResponseInterface{
void onResponseGiven(String response);
}
}
为什么ClassCastException
告诉MainActivity无法转换为MySingleton.ResponseInterface?
答案 0 :(得分:1)
在MySingleton
班级
public class MySingleton{
private static MySingleton mInstance;
private static Context mContext;
public ResponseInterface responseInterface;
private MySingleton(Context context){
mContext = context;
}
public static synchronized MySingleton getInstance(Context context){
if(mInstance == null){
mInstance = new MySingleton(context);
}
return mInstance;
}
public void getSomeResponse(ResponseInterface responseInterface){
this.responseInterface = responseInterface;
responseInterface.onResponseGiven("send response");
}
public interface ResponseInterface{
void onResponseGiven(String response);
}
}
在Fragment
final MySingleton mysingleton = MySingleton.getInstance(getActivity());
// edited here
mysingleton.getSomeResponse(Myfragment.this);
答案 1 :(得分:0)
如果您将MainActivity
投射到MySingleton.ResponseInterface
,则必须确保正在实施它。
在您的实际代码中,MyFragment
正在实施MySingleton.ResponseInterface
我猜 MainActivity不
当您致电MySingleton.getResponse()
时,您正在向您的单身人士中的responseInterface
发送讯息。 (我猜你的活动,因为它是你创建单例实例时的上下文)。
public void getSomeResponse(){
responseInterface.onResponseGiven("send response");
}
如果您想获得片段的答案,您必须确保单例调用您的片段实例。
无论如何,有一个非常系列的设计问题。将片段/活动实例附加到您的单例可能会导致记忆泄漏,如果您在销毁它们时没有释放。阅读this
此外,您的单身人士并非真正的单身人士,您每次致电getIntance
后都会创建一个新实例。
答案 2 :(得分:0)
您应该将this
传递给getInstance方法:
MySingleton.getInstance(this);
并尝试将其转换为MySingleton.ResponseInterface而不是MySingleton。
答案 3 :(得分:0)
您正在获取类强制转换异常,因为在行final MySingleton mysingleton = MySingleton.getInstance(getContext());
中,您正在传递活动上下文,并且您正在尝试将该上下文强制转换为ResponseInterface。 ResponseInterface由Myfragment实现。
要解决它:您可以更改MySingeton类构造函数,如下所示
private MySingleton(Context context, ResponseInterface responseInterface){
mContext = context;
this.responseInterface = responseInterface;
}
和调用部分(在MyFragment OnCreateView中)为
final MySingleton mysingleton = MySingleton.getInstance(getContext(), this);
和getInstance方法为
public static synchronized MySingleton getInstance(Context context, ResponseInterface responseInterface){
if(mInstance == null){
mInstance = new MySingleton(context, responseInterface);
}
return mInstance;
}