9

嗨,我正在使用 php 从 mysql 数据库中获取数据,并且在成功接收到数据后,我调用了一个需要打印数据的新活动。

这是我的代码:

public class RecoProd extends Activity {
    EditText pd;
    TextView error;

    ArrayList<NameValuePair> postParameters;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recomain);
        pd = (EditText) findViewById(R.id.name);

        error = (TextView) findViewById(R.id.myTableLayout);

        pd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                postParameters = new ArrayList<NameValuePair>();
                postParameters.add(new BasicNameValuePair("product", pd
                        .getText().toString()));


                // String valid = "1";

                DownloadWebPageTask dw = new DownloadWebPageTask();
                dw.execute("");

            }
        });
    }

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
            String response = null;
            for (String url : urls) {
                try {
                    response = CustomHttpClient.executeHttpPost("http://10.0.2.2/abc/check2.php", postParameters);  
                    String res = response.toString();
                    // res = res.trim();
                    res = res.replaceAll("\\s+", "");
                    // error.setText(res);
                    if(res.equals("1")){     ***<<--------------I think the error is here***
                        Intent loginintent = new Intent(RecoProd.this, RecoProd1.class);
                        startActivity(loginintent);
                    }
                    else
                        error.setText("Sorry!! ");





                } catch (Exception e) {


                }
            }
            return response;
        }

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

这是我的 php 代码:

<?php
$pd=$_POST['name'];

//connect to the db
$user = "root";
$pswd = "";
$db = "mylogin";
$host = "localhost";
$conn = mysql_connect($host, $user, $pswd);
mysql_select_db($db);

$query = "SELECT * FROM recoprod  ";
$result = mysql_query("SELECT * FROM recoprod");
while($row = mysql_fetch_array($result))
  {
  $output[]=$row;
  }
/*
$result = mysql_query($query) or die("Unable to verify user because : " . mysql_error());
//this is where the actual verification happens  
if(mysql_num_rows($result) > 0)  
echo 1;  // for correct login response  
else  
echo 0; // for incorrect login response */
?>

当我执行它时,我正在关闭它。

EDITED CODE





package com.androidhive.googleplacesandmaps;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class RecoProd extends Activity {
    EditText pd;
    TextView error;

    ArrayList<NameValuePair> postParameters;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        try {
            Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
                    .getContextClassLoader());

            Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread
                    .currentThread().getContextClassLoader());

            Class<?> threadPolicyBuilderClass = Class.forName("android.os.StrictMode$ThreadPolicy$Builder", true,
                    Thread.currentThread().getContextClassLoader());

            Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);

            Method detectAllMethod = threadPolicyBuilderClass.getMethod("detectAll");
            Method penaltyMethod = threadPolicyBuilderClass.getMethod("penaltyLog");
            Method buildMethod = threadPolicyBuilderClass.getMethod("build");

            Constructor<?> threadPolicyBuilderConstructor = threadPolicyBuilderClass.getConstructor();
            Object threadPolicyBuilderObject = threadPolicyBuilderConstructor.newInstance();

            Object obj = detectAllMethod.invoke(threadPolicyBuilderObject);

            obj = penaltyMethod.invoke(obj);
            Object threadPolicyObject = buildMethod.invoke(obj);
            setThreadPolicyMethod.invoke(strictModeClass, threadPolicyObject);

        } catch (Exception ex) {
            String TAG = null;
            Log.w(TAG, ex);
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recomain);
        pd = (EditText) findViewById(R.id.name);

        error = (TextView) findViewById(R.id.showresult);

        pd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                postParameters = new ArrayList<NameValuePair>();
                postParameters.add(new BasicNameValuePair("product", pd
                        .getText().toString()));


                // String valid = "1";

                DownloadWebPageTask dw = new DownloadWebPageTask();
                dw.execute("");

            }
        });
    }

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
            String response = null;
            for (String url : urls) {
                try {
                    response = CustomHttpClient.executeHttpPost("http://10.0.2.2/abc/check2.php", postParameters);  
                    String res = response.toString();
                    // res = res.trim();
                    res = res.replaceAll("\\s+", "");
                    // error.setText(res);
                    try{
                        res = "";
                  JSONArray jArray = new JSONArray(res);
                        for(int i=0;i<jArray.length();i++){
                                JSONObject json_data = jArray.getJSONObject(i);
                                Log.i("prod_id","id: "+json_data.getInt("prod_id")+
                                        ", prod_name: "+json_data.getString("prod_name")+
                                        ", prod_category: "+json_data.getInt("prod_category")+
                                        ", prod_cost: "+json_data.getInt("prod_cost")
                                );
                                //Get an output to the screen
                                res += "\n" + json_data.getString("prod_id") + " -> "+ json_data.getInt("prod_name");
                        }
                }
                catch(JSONException e){
                        Log.e("log_tag", "Error parsing data "+e.toString());
                }

                try{
                 error.setText(res);
                }
                catch(Exception e){
                 Log.e("log_tag","Error in Display!" + e.toString());;          
                }   
           }
                 catch (Exception e) {
            Log.e("log_tag","Error in http connection!!" + e.toString());     
           }
            }
            return response;

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

这是我的 php 代码:

<?php
$pd = $_POST['name'];

//connect to the db
$user = "root";
$pswd = "";
$db = "mylogin";
$host = "localhost";
$conn = mysql_connect($host, $user, $pswd);
mysql_select_db($db);

$query = "SELECT * FROM recoprod  ";
$result = mysql_query("SELECT * FROM recoprod");
while($row = mysql_fetch_array($result)) {
    $output[] = $row;
}
print(json_encode($output));
mysql_close();
/*
$result = mysql_query($query) or die("Unable to verify user because : " . mysql_error());
//this is where the actual verification happens  
if(mysql_num_rows($result) > 0)  
echo 1;  // for correct login response  
else  
echo 0; // for incorrect login response */
?>

嗨,我对上面编辑的代码进行了一些更改。

而且我只有 2 行,每行包含 4 个数据。

4

2 回答 2

2

您的问题出在 AsyncTask 部分

当您使用 AsyncTask 时,您可以在 doInBackground 函数上处理数据,但在 onPostExecute 上更新 UI。将处理后的值返回给 onPostExecute,因为在 android 上使用 AsyncTask 允许您在加载完成后更改布局上的内容。但仅在 onPostExecute 状态下,因此在 doInBackground 上处理您的 json,然后将其反映到 onPostExecute 上的布局

public class RecoProd extends Activity {
EditText pd;
TextView error;

ArrayList<NameValuePair> postParameters;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.recomain);
    pd = (EditText) findViewById(R.id.name);

    error = (TextView) findViewById(R.id.myTableLayout);

    pd.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            postParameters = new ArrayList<NameValuePair>();
            postParameters.add(new BasicNameValuePair("product", pd
                    .getText().toString()));


            // String valid = "1";

            DownloadWebPageTask dw = new DownloadWebPageTask();
            dw.execute("");

        }
    });
}

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        String response = null;
        for (String url : urls) {
            try {
                response = CustomHttpClient.executeHttpPost("http://10.0.2.2/abc/check2.php", postParameters);  
                String res = response.toString();
                // res = res.trim();
                res = res.replaceAll("\\s+", "");
                // error.setText(res);






            } catch (Exception e) {


            }
        }
        return res;
    }

    @Override
    protected void onPostExecute(String result) {

         if(result.equals("1")){    
             Intent loginintent = new Intent(RecoProd.this, RecoProd1.class);
             startActivity(loginintent);
         }
         else
             error.setText("Sorry!! ");
    }
}

}

于 2013-02-20T05:53:41.297 回答
0

这是您可以执行的操作:

public class RecoProd extends Activity {
EditText pd;
TextView error;

ArrayList<NameValuePair> postParameters;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.recomain);
    pd = (EditText) findViewById(R.id.name);

    error = (TextView) findViewById(R.id.myTableLayout);

    pd.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            postParameters = new ArrayList<NameValuePair>();
            postParameters.add(new BasicNameValuePair("product", pd
                    .getText().toString()));


            // String valid = "1";

            downloadWebPageTask();

        }
    });
}

private void downloadWebPageTask extends AsyncTask<String, Void, String> {
    String url = "http://10.0.2.2/abc/check2.php?postParameters=paramValue";
    grabURL(url);
}


public void grabURL(String url){
    try {
        new GrabURL().execute(new URL(url));
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

private class GrabURL extends AsyncTask<URL, Integer, JSONObject> {

    @Override
    protected JSONObject doInBackground(URL... urls) {
        // This method will send the http request
        JSONObject jsonResponse=null;
        try 
        {
            URL link = urls[0];
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet request = new HttpGet(link.toString());
            ResponseHandler<String> responseHandler=new BasicResponseHandler();
            String responseBody = httpClient.execute(request, responseHandler);
            jsonResponse = new JSONObject(responseBody);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return jsonResponse;
    }

    @Override
    protected void onPreExecute() {
        // This method will be executed before the http request
        // In this method you can do things like showing the loading sign
    }

    @Override
    protected void onPostExecute(JSONObject jsonObj) {
        // This method will run after the http request and contains the results
        // This method expectes you return a valid jSon from the server
        try {
            if(! jsonObj.getString("code").equalsIgnoreCase("200") ){
                // Bad response from server
            }
            else if( jsonObj.has("data") ){
                JSONArray dataArray = jsonObj.getJSONArray("data");

                String tmpUserLoc = (String) jsonObj.getJSONObject("data").get("userLocation");
                String tempUserNIC = (String) jsonObj.getJSONObject("data").get("userNIC");
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        // You can stop the loading sign here if you showed it in OnPreExecute
    }

}

}

我没有测试过这段代码,但它应该可以工作。如果您要从服务器返回 jSon Array,您可能需要查看jSonArray doc 或者此链接也可能会有所帮助。

于 2013-02-25T21:41:58.660 回答