【问题标题】:How to Cast Fragment's context to interface如何将片段的上下文转换为接口
【发布时间】:2015-12-15 13:12:09
【问题描述】:

我想使用 interfaceAsyncTask 类返回一个值。问题是我的以下代码在 Activity 中运行良好,但在片段类中运行良好。

我得到了ClassCastException 这样的:

java.lang.ClassCastException: com.demo.HomeActivity cannot be cast to com.demo.helper.OnTaskCompleteListener
at com.demo.util.JSONParseAsync.<init>(JSONParseAsync.java:33)
at com.demo.fragment.PersonalDetailFragment.loadProfileAction(PersonalDetailFragment.java:93)
at com.demo.fragment.PersonalDetailFragment.onCreate(PersonalDetailFragment.java:81)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1942)

接口类:

public interface OnTaskCompleteListener {

void onTaskComplete(JSONObject jsonObject);

}

PersonalDetailFragment 类:

public class PersonalDetailFragment extends Fragment  implements OnTaskCompleteListener {
private View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_personal_detail, container,
            false);
    loadProfileAction();
    return view;
}
private void loadProfileAction() {

    SessionPreference preference = new SessionPreference(getActivity());
    try {
        String encodedUrl = URLEncoder.encode(preference.getSessionId(), "UTF-8")
                + ","
                + URLEncoder.encode(Constants.URL_TOKEN, "UTF-8");
        // URL base64Encode
        String processUrl = Base64.encodeToString(encodedUrl.getBytes("UTF-8"), Base64.DEFAULT);

        JSONParseAsync parseAsync = new JSONParseAsync(getContext()); // also try getActivity()
        parseAsync.execute((URLConstants.GET_USER_DETAIL_URL+processUrl).trim());

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
@Override
public void onTaskComplete(JSONObject jsonObject) {
    try {

        boolean status = jsonObject.getBoolean(URLConstants.TAG_STATUS);

        Log.e(Constants.DEBUG_TAG, "Status:- " + status);

        if (status == true) {
            JSONArray dataarray = jsonObject.getJSONArray(URLConstants.TAG_DATA);
            JSONObject data = dataarray.getJSONObject(0);
            fillProfileData(data);

        } else if (status == false) {
            Snackbar.make(view,
                    "Incorrect User Name OR Password",
                    Snackbar.LENGTH_LONG).show();
        }

        Log.i("GARG", "Excution Line Finish ");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

JSONParseAsync 类:

public class JSONParseAsync extends AsyncTask<String, String, JSONObject>{

private Context mContext;

ProgressDialog mProgress;
private OnTaskCompleteListener mCallback;

public JSONParseAsync(Context context){
    this.mContext = (AppCompatActivity)context;
    this.mCallback = (OnTaskCompleteListener) mContext;
}

@Override
protected JSONObject doInBackground(String... URL) {
    JSONObject jsonObj = null;

    try{
    Log.d(Constants.DEBUG_TAG, "line excucation 2 doInBackground");
    ServiceHandler sh = new ServiceHandler();
    String url = URL[0];
    Log.d(Constants.ACTIVITY_TAG, "...." + url);
    // Making a request to url and getting response.

    String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

    Log.d(Constants.JSON_TAG, "" + jsonStr);

    if (jsonStr != null) {

            jsonObj = new JSONObject(jsonStr);
            Log.e(Constants.JSON_TAG, "" + jsonObj);

    }
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return jsonObj;
}

@Override
protected void onPreExecute() {
    Log.d(Constants.DEBUG_TAG, "line excucation 1 onPreexcute");
    mProgress = new ProgressDialog(mContext);
    mProgress.setMessage("Downloading nPlease wait...");
    mProgress.show();
}

@Override
protected void onProgressUpdate(String... values) {
    Log.d(Constants.DEBUG_TAG, "line excucation 3 onProgressUpdate");
    mProgress.setMessage(values[0]);
}


@Override
protected void onPostExecute(JSONObject result) {
    Log.d(Constants.DEBUG_TAG, "line excucation 3 onPostExecute");
    mProgress.dismiss();
    //This is where you return data back to caller
    Log.d(Constants.APP_TAG, " final result:- "+result);
    mCallback.onTaskComplete(result);
}

}

请帮帮我:

【问题讨论】:

    标签: java android android-fragments interface android-asynctask


    【解决方案1】:

    这样做

    JSONParseAsync parseAsync = new JSONParseAsync(getContext());
    

    您将Activity 发送到您的AsyncTask,但实现OnTaskCompleteListener 的是您的Fragment

    要么让你的Activity 实现你的界面,要么

    这样做:

    JSONParseAsync parseAsync = new JSONParseAsync(this, getContext());
    

    并将您的 AsyncTask 构造函数更改为

    public JSONParseAsync(OnTaskCompleteListener listener, Context context){
        this.mContext = context;
        //this.mContext = (AppCompatActivity)context; -> you don't need that cast, AppCompatActivity is a subclass of Context
        this.mCallback = listener;
    }
    

    【讨论】:

    • 很高兴能帮到你 ;) 编码愉快!
    • @2Dee Rocks .快乐编码
    【解决方案2】:

    为您的任务构造函数使用 2 个参数:

    public JSONParseAsync(Context context, OnTaskCompleteListener listener){
        this.mContext = context;
        this.mCallback = listener;
    }
    

    并使用

    创建一个新实例
        JSONParseAsync parseAsync = new JSONParseAsync(getContext(), this);
    

    因为当你传递上下文时,你传递的不是片段而是底层的活动。因此,如果您想在片段中使用您的任务,您可能需要 2 个参数。

    【讨论】:

      【解决方案3】:

      您的问题是,因为您已将 Activity 上下文传递给JSONParseAsync,并且在其构造函数中,您将其转换为活动AppCompatActivity,然后将活动转换为OnTaskCompleteListener。所以,您的活动应该实现听众而不是你的片段。

      HomeActivity实现你的接口OnTaskCompleteListener

      示例:

      public class HomeActivity extends AppCompatActivity implements OnTaskCompleteListener{
      ...
      }
      

      在我看来,除非需要,否则不要创建自定义类。在你的情况下,你也应该用匿名类完成你的任务..没有必要创建单独的类..

      希望你明白我的意思。

      不过,你可以做的是,在构造函数中传递上下文和 OnTaskCompleteListener

      private void loadProfileAction() {
      ...
      
              JSONParseAsync parseAsync = new JSONParseAsync(getContext(), this); // also try getActivity()
              ...
      
      }
      

      并将构造函数更改为:

      public JSONParseAsync(Context context, OnTaskCompleteListener listener){
          this.mContext = context;
          this.mCallback = listener;
      }
      

      【讨论】:

      • @Garg's 那你为什么要创建界面?
      • b'因为我需要在项目中多次调用 JSONParseAsync 类,所以需要返回 json 结果。
      • 是的,先生.. 我检查了它&+1。谢谢你的帮助。
      猜你喜欢
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 2020-04-17
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多