如何使AsynkTask类分离并更新另一个类的UI?

时间:2016-04-08 07:28:18

标签: android

我有一个名为Login的片段,我有一个名为LoginAttempt的AsynkTask,它是从Login Fragment执行的,当前AsynkTask是Login Fragment的Inner类,现在我想要的是将AsynkTask与Login类分开并更新登录Fragment的UI。

我该怎么做?

这是我的登录片段,其中包含AsynkTask作为内部类:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    m_Main = inflater.inflate(R.layout.login_screen, container, false);
    ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
    CMainActivity.m_Drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
    m_oLoginSession = new CLoginSessionManagement(getActivity());
    init();// initialize controls
    return m_Main;
}

public void init() {
    m_MainLayout = (LinearLayout) m_Main.findViewById(R.id.mainLayout);


    m_InputMobile = (EditText) m_Main.findViewById(R.id.input_mobile);
    m_InputPassword = (EditText) m_Main.findViewById(R.id.input_password);

    m_LoginBtn = (AppCompatButton) m_Main.findViewById(R.id.btn_Login);
    m_ChangePass = (AppCompatButton) m_Main.findViewById(R.id.btn_ChangePass);
    m_ChangePass.setBackgroundColor(Color.TRANSPARENT);
    m_ChangePass.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, new CChangePasswordScreen()).commit();
        }
    });

    m_RegisterBtn = (AppCompatButton) m_Main.findViewById(R.id.btn_Register);

    m_RegisterBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, new CRegistrationScreen()).commit();
        }
    });
    m_LoginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new LoginAttempt().execute();
        }
    });
}

private class LoginAttempt extends AsyncTask<String, Void, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setCancelable(false);
        pDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small);
        // and now the magic
        pDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        pDialog.getWindow().setGravity(Gravity.BOTTOM);
        pDialog.getWindow().getAttributes().verticalMargin = 0.5f;
        pDialog.show();
//          CProgressBar.getInstance().showProgressBar(getActivity(), "Please wait while Logging...");// showing progress ..........
    }

    @Override
    protected String doInBackground(String... params) {
        getLoginDetails();// getting login details from editText...........
        InputStream inputStream = null;
        m_oJsonsResponse = new CJsonsResponse();
        isFirstLogin = true;
        try {
            // 1. create HttpClient
            HttpClient httpclient = new DefaultHttpClient();
            // 2. make POST request to the given URL
            HttpPost httpPost = new HttpPost(s_szLoginUrl);
            String json = "";
            // 3. build jsonObject
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("agentCode", s_szMobileNumber);
            jsonObject.put("pin", s_szPassword);
            jsonObject.put("firstloginflag", m_oLoginSession.isLogin());
            // 4. convert JSONObject to JSON to String
            json = jsonObject.toString();
            // 5. set json to StringEntity
            StringEntity se = new StringEntity(json);
            // 6. set httpPost Entity
            httpPost.setEntity(se);
            // 7. Set some headers to inform server about the type of the content
            //  httpPost.setHeader("Accept", "application/json");   ///not required
            httpPost.setHeader("Content-type", "application/json");
            // 8. Execute POST request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpPost);
            HttpEntity entity = httpResponse.getEntity();
            // 9. receive response as inputStream
            inputStream = entity.getContent();
            System.out.print("InputStream...." + inputStream.toString());
            System.out.print("Response...." + httpResponse.toString());

            StatusLine statusLine = httpResponse.getStatusLine();
            System.out.print("statusLine......" + statusLine.toString());
            ////Log.d("resp_body", resp_body.toString());
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                // 10. convert inputstream to string
                if (inputStream != null) {
                    s_szresult = m_oJsonsResponse.convertInputStreamToString(inputStream);
                    //String resp_body =
                    EntityUtils.toString(httpResponse.getEntity());
                }
            } else
                s_szresult = "Did not work!";

        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }
        return s_szresult;
    }

    @Override
    protected void onPostExecute(final String response) {
        super.onPostExecute(response);
        m_Handler = new Handler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                m_Handler.post(new Runnable() {
                    @Override
                    public void run() {
                        CProgressBar.getInstance().hideProgressBar();// hide progressbar after getting response from server......
                        try {
                            m_oResponseobject = new JSONObject(response);// getting response from server
                            new Thread() {// making child thread...
                                public void run() {
                                    Looper.prepare();
                                    try {
                                        getResponse();// getting response from server ........
                                        Looper.loop();
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }.start();

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }).start();
    }

    public void getResponse() throws JSONException {
        if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Transaction Successful")) {
            m_oLoginSession.setLoginData(s_szResponseMobile, s_szResponsePassword);
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, new CDealMainListing()).commit();
            CToastMessage.getInstance().showToast(getActivity(), "You are successfully Logged In");
        } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Agentcode Can Not Be Empty")) {
            CToastMessage.getInstance().showToast(getActivity(), "Please Enter Valid Mobile Number");
        } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Pin Can Not Be Empty")) {
            CToastMessage.getInstance().showToast(getActivity(), "Please Enter Password");
        } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Invalid PIN")) {
            CToastMessage.getInstance().showToast(getActivity(), "Please enter correct Password");
        } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Subscriber/Agent Blocked due to Wrong Attempts")) {
            CToastMessage.getInstance().showToast(getActivity(), "You are blocked as You finished your all attempt");
        } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Connection Not Available")) {
            CToastMessage.getInstance().showToast(getActivity(), "Connection Lost ! Please Try Again");
        } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Subscriber/Agent Not Found")) {
            CToastMessage.getInstance().showToast(getActivity(), "User not found ! Kindly Regiter before Login");
        } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("OTP not verify")) {
            CToastMessage.getInstance().showToast(getActivity(), "Otp not Verify ! Kindly Generate Otp on Sign Up");
        }
    }

    public void getLoginDetails() {
        s_szMobileNumber = m_InputMobile.getText().toString();
        s_szPassword = m_InputPassword.getText().toString();
    }
}
}

我希望这个AsynkTask与Login类的Login Class和Update UI分开。

1 个答案:

答案 0 :(得分:0)

单独的班级AsyncTask

public class LoginAttempt extends AsyncTask<String, Void, String>{
   private OnTaskComplete callback;

   public LoginAttempt(OnTaskComplete onTaskComplete, ...){
      callback = onTaskComplete;
      ... // some other data if needed.
   }

   @Override
   protected String doInBackground(String... params) {
       ...
   }

   @Override
   protected void onPostExecute(final String response) {
       super.onPostExecute(response);

       if(callback!=null){
           callback.onSuccess(data);
           // similarly for failure.
       }
   }
}

// interface used for communicating back to origin activity or fragment
public interface OnTaskComplete{
    void onSuccess(Object result);
    void onFailure(Object error);
}

现在在activityfragment

中实施界面