无法将AsyncTask的响应发布到MainActivity

我是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 { @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 nameValuePairs = new ArrayList(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成为活动类的内部类,并在onPostExecute更新ui

或者使用界面

如何从AsyncTask返回一个布尔值?

编辑

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

在你的asyctask

  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 } 

这是错误的做法。 最好的方法是,如果您不需要其他任何地方的AsyncTask那么将它作为Activity的内部类。 然后它可以访问您的Activity和函数的成员变量,以便它可以在onPostExecute()轻松更新变量。

如果要将其保存为单独的文件,则可以使用interface来侦听回调。

这个答案在答案的底部有一个界面示例 。

只需更改你的onPostExecute()

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

然后你有

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

这不是什么都不做

MainActivity main = new MainActivity();