Can't post response from AsyncTask to MainActi

2019-01-20 06:43发布

问题:

I'm new to Android application development. Please find my code for AsyncTask for connecting a URL when a user clicked on a button.

    package in.mosto.geeglobiab2bmobile;

    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.StatusLine;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;

    import android.os.AsyncTask;

    public class OnbuttonclickHttpPost extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            byte[] result = null;
            String str = "";
           // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://URL_HERE/login.php");

            try {
                    // Add your data
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                    nameValuePairs.add(new BasicNameValuePair("mobile", params[0]));
                    nameValuePairs.add(new BasicNameValuePair("password", params[1]));
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    // Execute HTTP Post Request
                    HttpResponse response = httpclient.execute(httppost);
                    StatusLine statusLine = response.getStatusLine();
                    if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){
                    result = EntityUtils.toByteArray(response.getEntity());
                    str = new String(result, "UTF-8");
                }
              } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
            }  
            return str;
        }

        /**
         * on getting result
         */
        @Override
        protected void onPostExecute(String result) {
            // something with data retrieved from server in doInBackground
            //Log.v("Response ", result);

            MainActivity main = new MainActivity();

            if(result.equals("NO_USER_ERROR")){
                main.showNewDialog("There is no user existed with the given details.");
            }else if(result.equals("FIELDS_ERR")){
                main.showNewDialog("Please enter username and password.");
            }else{
                main.startRecharge(result);
            }
        }
    }

See my MainActivity Methods:

    OnbuttonclickHttpPost t = new OnbuttonclickHttpPost();
    t.execute(mobile.getText().toString(),pass.getText().toString());

public void startRecharge(String param){
    Intent inte = new Intent(MainActivity.this.getBaseContext(), StartRecharge.class);
    startActivity(inte);
}

public void showNewDialog(String alert){
    new AlertDialog.Builder(this)
        .setTitle("Please correct following error")
        .setMessage(alert)
        .setPositiveButton("Okay", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();
            }
        })
        .show();
}

Here i'm getting an error. I don't know whats wrong with my code. Can any one please help me ?

回答1:

This is wrong. You should not create an instance of your activity class.

 MainActivity main = new MainActivity();

Activity is started by startActivity.

You can make your asynctask an inner class of your activity class and update ui in onPostExecute

Or use a interface

How do I return a boolean from AsyncTask?

Edit

   new OnbuttonclickHttpPost(ActivityName.this).execute(params);

In your asyctask

  TheInterface listener;

In the construcotr

  public OnbuttonclickHttpPost(Context context)
{

    listener = (TheInterface) context;
    c= context;

}    

The interface

  public interface TheInterface {

    public void theMethod(String result);

     }

In onPostExecute

    if (listener != null) 
  {
      listener.theMethod(result);
      }

In your activity class implement the interface

     implements OnbuttonclickHttpPos.TheInterface

Implement the method

     @Override
     public void theMethod(STring result) {
   // update ui using result
     }


回答2:

This is the wrong way to do it. The best way is if you don't need that AsyncTask anywhere else then make it an inner class of your Activity. Then it will have access to member variables of your Activity and functions so it can update variables easily in your onPostExecute().

If you want to keep it as a separate file then you can use an interface to listen for a callback.

This answer has an interface example at the bottom of the answer.



回答3:

just change your onPostExecute()

@Override
protected void onPostExecute(String result) {
    parseResponse(result);      
}

and then you have

private void parseResponse(String result) {
    if(result.equals("NO_USER_ERROR")){
        showNewDialog("There is no user existed with the given details.");
    }else if(result.equals("FIELDS_ERR")){
        showNewDialog("Please enter username and password.");
    }else{
        startRecharge(result);
    }
}

This is not doing nothing

MainActivity main = new MainActivity();