当前位置: 首页 > 面试题库 >

无法将响应从AsyncTask发布到MainActivity

卢承弼
2023-03-14
问题内容

我是Android应用程序开发的新手。请找到我的AsyncTask代码,用于在用户单击按钮时连接URL。

    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);
            }
        }
    }

请参阅我的MainActivity方法:

    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();
}

在这里,我遇到了一个错误。我不知道我的代码有什么问题。谁能帮帮我吗 ?


问题答案:

错了 您不应创建活动类的实例。

 MainActivity main = new MainActivity();

活动由开始startActivity

您可以将asynctask设为活动类的内部类,并在其中更新ui onPostExecute

或使用界面

如何从AsyncTask返回布尔值?

编辑

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

在你的任务中

  TheInterface listener;

在施工中

  public OnbuttonclickHttpPost(Context context)
{

    listener = (TheInterface) context;
    c= context;

}

介面

  public interface TheInterface {

    public void theMethod(String result);

     }

在onPostExecute中

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

在您的活动类中实现接口

     implements OnbuttonclickHttpPos.TheInterface

实施方法

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


 类似资料:
  • 我看了其他问题,但我无法澄清从另一个任务调用一个任务的疑问,我有以下代码: parseJSON是一个任务,当我运行程序时,它什么也不做,甚至不调用任务,这就像Android为了安全而忽略的一样。

  • 目前,我正在通过外部URL检索数据,该URL使用PHP脚本并返回JSON值。工作很好。 但如何发送用于查询的字符串,以便在PHP脚本中执行以下操作: 注意:我不想使用凌空抽射。 我的AsyncTask扩展类,它当前不向URL发送任何值。

  • 我正在尝试使用jQuery创建一个更新字符串数组的POST。服务器是一个引导Spring MVC服务器。当我执行POST时,服务器的响应是。 Spring控制器 2014-11-20 18:44:53.427信息6724---[main]o.s.w.s.handler.SimpleURLHandlerMapping:将URL路径[/]映射到类型为[class org.springframework

  • 问题内容: 我不熟悉Spring RestTemplate。 但是对于这个项目,我必须使用Spring RestTemplate发送POST调用以使用rest api。 我正在使用此代码: 一切正常。 我想检索HTTP状态代码(例如:200 OK。)。我该怎么办?谢谢。 问题答案: 您可以按以下方式使用postForEntity方法…

  • 我想从React获取文件上传并将其发送到SpringBoot。我试图从React FormData发布,它将包含文件名和XML文件的键值对。因此,当我尝试将FormData发布到后端(即Springboot)时,它返回: 这是我的Springboot控制器: 我已经尝试在Axios post请求的头中指定multipart/form-data,但似乎不起作用。问题出在我的请求里还是出在我的控制器上