在获取字符串结果后,如何在<asynctask>上扩展类的onPostExecute()?

时间:2015-11-20 20:32:55

标签: java android android-asynctask

我正在使用连接到在线数据库的我的Android应用程序的登录系统。如果我要显示onPostExecute()提供的结果,它会起作用,但是如果我要把它放在条件语句上做某事,它就不起作用了;或者我应该说,它在起作用,但它无限制地工作。

如何在获取字符串结果后停止执行onPostExecute?

无论如何,这是我的代码:

的login.php

package com.example.navigationdrawerexample;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Login extends Activity implements OnClickListener, Connector.OnPostExecuteListener{
    EditText studnum;
    EditText pass;
    Button login;
    Button reg;
    TextView errorlog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        studnum = (EditText) findViewById(R.id.studnum);
        pass = (EditText) findViewById(R.id.password);
        login = (Button) findViewById(R.id.login);
        reg = (Button) findViewById(R.id.register);
        errorlog = (TextView) findViewById(R.id.errorlog);
        login.setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        if (arg0.getId() == R.id.login){
            ConnectivityManager conv = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mWifi = conv.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

            if (!(mWifi.isConnected())){
                Toast.makeText(this, "Enable your internet connection first!", Toast.LENGTH_LONG).show();
            } else {
                String student_num = studnum.getText().toString();
                String password = pass.getText().toString();
                Connector connect= new Connector(this,0,"authenticate",0,0,0,student_num,password);
                connect.setOnPostExecuteListener(this);
                connect.execute("");
            }
        }
    }

    @Override
    public void onPostExecute(String result) {


        // TODO Auto-generated method stub


        if (result == "false"){
            errorlog.setText("Incorrect login information..");
        } else if (result == "true"){
            Intent goToLogInMod = new Intent("com.example.navigationdrawerexample.MAINACTIVITY");
            startActivity(goToLogInMod); //para pumunta sa login module
        }

    }
}

Connector.php 如果您注意到一些没用的构造函数参数,请忽略它:)

package com.example.navigationdrawerexample;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class Connector extends AsyncTask<String,Void,String>{
    private OnPostExecuteListener onPostExecuteListener;
    private Context context;
    private int collegeactive;
    private String flag;
    private int spec_art;
    private String response;
    private int month;
    private int yr;
    private String username;
    private String password;

    public Connector(Context context,int college, String flag,int spec_art,int month, int yr,String username, String password){
        this.context = context;
        this.collegeactive = college;
        this.flag = flag;
        this.spec_art = spec_art;
        this.yr = yr;
        this.month = month;
        this.username = username;
        this.password = password;
    }

    public interface OnPostExecuteListener {
        void onPostExecute(String result);
    }

    public void setOnPostExecuteListener(OnPostExecuteListener listener){
        this.onPostExecuteListener = listener;
    }

    protected void onPreExecute(){
        if (flag == "authenticate"){
            Toast.makeText(context, "Please wait...", Toast.LENGTH_LONG).show();
        }

    }


    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        try{
            String link = "";
            if (flag ==  "headline"){
                link = "http://rtu-astronet.com/emag/functions.php?action=printHeadline&coll_id="+collegeactive;
            } else if (flag == "list"){
                link = "http://rtu-astronet.com/emag/functions.php?action=printArticlePerCollege&collegeid="+collegeactive+"&acadornot=1";
            } else if (flag == "spec_article"){
                link = "http://rtu-astronet.com/emag/functions.php?action=printSpecificArticle&articleid="+spec_art;
            } else if (flag == "permonth"){
                link = "http://rtu-astronet.com/emag/functions.php?action=printArticlePerMonth&month="+month+"&year="+yr+"&acadornot=1";
            } else if (flag == "authenticate"){
                link = "http://rtu-astronet.com/emag/functions.php?action=checkAccount&username="+username+"&password="+password;
            }
            URL url = new URL(link);
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(link));
            HttpResponse response = client.execute(request);
            BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            StringBuffer sb = new StringBuffer("");
            String line = "";

            while ((line = in.readLine()) != null) {
                sb.append(line);
                //break;
            }

            in.close();
            return sb.toString();
        } catch(Exception e){
             return new String("Exception: " + e.getMessage());
        }
    }


    @Override
    protected void onPostExecute(String result) {
        if (flag != "authenticate"){
        result = "{ \n \"Data\": \n " + result + " \n }";
        }

        if(onPostExecuteListener !=null){
            onPostExecuteListener.onPostExecute(result);
        }

    }

}

2 个答案:

答案 0 :(得分:0)

如果我是对的,我认为它是关于你的监听器,你永远不会在onPostExecute方法中向你的监听器返回false或true,但是你在登录活动中检查true或false值。 我跳了它帮助

你的AsyncTask中的

protected void onPostExecute(String result) {
    if (flag != "authenticate"){
    result = "{ \n \"Data\": \n " + result + " \n }";
    }

    if(onPostExecuteListener !=null){
        onPostExecuteListener.onPostExecute(result);
    }

}

并且您在登录时检查字符串是否为true或false string

答案 1 :(得分:0)

  1. 创建名为OnPostExecuteListener的类文件

    public interface OnPostExecuteListener {     public void onPostExecute(String result); }

  2. Login类中的
  3. 实现上面创建的界面。

    package com.example.navigationdrawerexample;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class Login extends Activity implements OnClickListener, OnPostExecuteListener {
    
    EditText studnum;
    EditText pass;
    Button login;
    Button reg;
    TextView errorlog;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
    
        studnum = (EditText) findViewById(R.id.studnum);
        pass = (EditText) findViewById(R.id.password);
        login = (Button) findViewById(R.id.login);
        reg = (Button) findViewById(R.id.register);
        errorlog = (TextView) findViewById(R.id.errorlog);
        login.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        if (arg0.getId() == R.id.login) {
            ConnectivityManager conv = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mWifi = conv.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    
            if (!(mWifi.isConnected())) {
                Toast.makeText(this, "Enable your internet connection first!", Toast.LENGTH_LONG).show();
            } else {
                String student_num = studnum.getText().toString();
                String password = pass.getText().toString();
                Connector connect = new Connector(Login.this, 0, "authenticate", 0, 0, 0, student_num, password);
                connect.execute("");
            }
        }
    }
    
    // this method provides you the result of onPost execute;
    @Override
    public void onPostExecute(String result) {
        // TODO Auto-generated method stub
        if (result == "false") {
            errorlog.setText("Incorrect login information..");
        } else if (result == "true") {
            Intent goToLogInMod = new Intent("com.example.navigationdrawerexample.MAINACTIVITY");
            startActivity(goToLogInMod); // para pumunta sa login module
        }
    
    }
    }
    
  4. 连接器类

    public class Connector extends AsyncTask<String, Void, String> {
    
    private OnPostExecuteListener onPostExecuteListener;
    private Context context;
    private int collegeactive;
    private String flag;
    private int spec_art;
    private String response;
    private int month;
    private int yr;
    private String username;
    private String password;
    
    public Connector(Context context, int college, String flag, int spec_art, int month, int yr, String username,
            String password) {
        this.context = context;
        this.collegeactive = college;
        this.flag = flag;
        this.spec_art = spec_art;
        this.yr = yr;
        this.month = month;
        this.username = username;
        this.password = password;
    }
    
    protected void onPreExecute() {
        if (flag == "authenticate") {
            Toast.makeText(context, "Please wait...", Toast.LENGTH_LONG).show();
        }
        onPostExecuteListener = (OnPostExecuteListener) context;
    }
    
    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
    
        try {
            String link = "";
            if (flag == "headline") {
                link = "http://rtu-astronet.com/emag/functions.php?action=printHeadline&coll_id=" + collegeactive;
            } else if (flag == "list") {
                link = "http://rtu-astronet.com/emag/functions.php?action=printArticlePerCollege&collegeid="
                        + collegeactive + "&acadornot=1";
            } else if (flag == "spec_article") {
                link = "http://rtu-astronet.com/emag/functions.php?action=printSpecificArticle&articleid=" + spec_art;
            } else if (flag == "permonth") {
                link = "http://rtu-astronet.com/emag/functions.php?action=printArticlePerMonth&month=" + month
                        + "&year=" + yr + "&acadornot=1";
            } else if (flag == "authenticate") {
                link = "http://rtu-astronet.com/emag/functions.php?action=checkAccount&username=" + username
                        + "&password=" + password;
            }
            URL url = new URL(link);
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(link));
            HttpResponse response = client.execute(request);
            BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    
            StringBuffer sb = new StringBuffer("");
            String line = "";
    
            while ((line = in.readLine()) != null) {
                sb.append(line);
                // break;
            }
    
            in.close();
            return sb.toString();
        } catch (Exception e) {
            return new String("Exception: " + e.getMessage());
        }
    }
    
    @Override
    protected void onPostExecute(String result) {
        if (flag != "authenticate") {
            result = "{ \n \"Data\": \n " + result + " \n }";
        }
    
        if (onPostExecuteListener != null) {
            onPostExecuteListener.onPostExecute(result);
        }
    }
    }