将数据从Android应用发布到PHP Web服务

时间:2013-08-16 17:34:40

标签: android string http-post bundle

我遇到了一个非常奇怪的错误。只有在我定义 nameValuePairs.add(new BasicNameValuePair(“country”,“USA”))时,下面的方法才能将数据发布到我的PHP Web服务并检索JSON编码数据; 但是,如果我使用String变量country而不是“USA”,我将从我的Web服务中获取null。我检查了String country的值,它不是null。以下是我的代码

我的字符串国家/地区定义如下:

public class Countries extends SupportMapFragment implements
    LocationListener, LocationSource
{
private GoogleMap map;
private OnLocationChangedListener mListener;
private LocationManager locationManager;
double mLatitude = 0;
double mLongitude = 0;
String country = "";
.......
    @Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
           .......
 }

字符串国家/地区通过Bundle对象获取上一个活动的值。该值不为空

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{

    View root = super.onCreateView(inflater, container, savedInstanceState);
    Bundle bundle = new Bundle();
    bundle = getArguments();
    if(bundle == null)
        Toast.makeText(getActivity(), "Country is NULL",
                Toast.LENGTH_LONG).show();
    else
    {

        country = getArguments().getString("countryName");


    }
    map = getMap();
    return root;
}

这是我的发布数据方法。

    private String postCountryType()
{
    String responseStr = "";

    try
    {
        // url where the data will be posted
        String postReceiverUrl =      "http://.../country.php";

        // HttpClient
        HttpClient httpClient = new DefaultHttpClient();

        // post header
        HttpPost httpPost = new HttpPost(postReceiverUrl);

        // add your data
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);

        nameValuePairs.add(new BasicNameValuePair("country", country));

        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // execute HTTP post request
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity resEntity = response.getEntity();

        if(resEntity != null)
        {

            responseStr = EntityUtils.toString(resEntity).trim();

            // you can add an if statement here and do other actions based
            // on the response
        }

    }
    catch (ClientProtocolException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    return responseStr;
}

当我使用String变量country而不是将数据“USA”直接传递给新的BasicNameValuePair时,responsStr返回null。

我尝试将新的BasicNameValuePair(“country”,country)修改为 new BasicNameValuePair(“country”,country.toString()),以及, new BasicNameValuePair(“country”,country +“”) 但不幸的是,这两种技巧都没有用。

其他信息 但是,如果我定义String country =“USA”,则在onCreateView中,值“Japan”实际上是通过getArguments分配给country。 BasicNameValuePair(“country”,country)将忽略值“Japan”,但使用原始值“USA”。

任何人都知道为什么会发生这种奇怪的事情?

提前致谢。

2 个答案:

答案 0 :(得分:1)

country可能不为null,但您是否检查过它是否为空字符串""?这就是它在Countries课程中初始化的内容。我会做Log.d("debugging", country),并检查LogCat以查看您创建NameValuePair时国家/地区的实际情况。

答案 1 :(得分:0)

问题解决了。我用onActivityCreated()替换了onCreate()。根据片段的生命周期,将在片段onActivityCreated()之前检索String country的值。