nwwyjf
nwwyjf
采纳率0%
2016-01-05 08:16

httppost = new HttpPost(Uri) 返回值为null! 不知道为什么

RT

http.java

public class Http {
    static HttpEntity entity;         //HttpEntity是可以同Http消息进行接受或发送的实体,可以是流或者字符串
    static HttpResponse response;     //HttpResponse是一个Http连接响应,可以通过它来获得一些响应的信息
    static HttpPost httppost;
    static HttpClient httpclient;
    static Context context;
    public  String strResult;
    public String Get(String Uri) {
        return null;
    }
    public String Post(final String Uri, final List<NameValuePair> params) {        
        new Thread() {          
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    //客户端数据打包
                    httpclient = new DefaultHttpClient();//新建httpclient对象, 默认的Http客户端,可以用它来创建HTTP连接
                    httppost = new HttpPost(Uri); //新建httppost对象, 连接url
                    httppost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
                    //客户端发送数据请求,并得到服务器返回数据
                    response = httpclient.execute(httppost);  //获取HttpResponse实例
                    entity = response.getEntity(); // 得到内容
                    if (response.getStatusLine().getStatusCode() == 200) {
                        // 取出回应字串
                        strResult = EntityUtils.toString(response.getEntity());
                    }
                } catch (Exception e) {
                    e.printStackTrace();// 报错识别
                }
                super.run();
            }
        }.start();
        return strResult;
    }
}

NetUtil。java
public class NetUitl {
public String register(String Username, String Password,String Idcard,String Name,String Sex,int Tel) {
    String Uri = "http://127.0.0.1:8080/Client/Register";
    String tel=String.valueOf(Tel);
    ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("Username", Username));
    params.add(new BasicNameValuePair("Password", Password));
    params.add(new BasicNameValuePair("Idcard", Idcard));
    params.add(new BasicNameValuePair("Sex", Sex));
    params.add(new BasicNameValuePair("Realname", Name));
    params.add(new BasicNameValuePair("Tel", tel));
    return new Http().Post(Uri, params);
}

register。java

public class register extends Activity {
EditText username,password,idcard,name,sex,time,tel;
Button register,login;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);
    username=(EditText) findViewById(R.id.zhuceusername);
    password=(EditText) findViewById(R.id.zhucepassword);
    idcard=(EditText) findViewById(R.id.zhuceidcard);
    name=(EditText) findViewById(R.id.zhucename);
    sex=(EditText) findViewById(R.id.zhucesex);
    tel=(EditText) findViewById(R.id.zhucetel);

    register=(Button) findViewById(R.id.zhuce);
    login=(Button) findViewById(R.id.denglu);

   new Thread(new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        register.setOnClickListener(new OnClickListener() {         
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                try{
                if(!username.getText().toString().equals("")&&!password.getText().toString().equals("")&&
                        !idcard.getText().toString().equals("")&&!name.getText().toString().equals("")&&
                        !sex.getText().toString().equals("")&&!tel.getText().toString().equals("")){
                    String f=new NetUitl().register(username.getText().toString(),password.getText().toString(), 
                            idcard.getText().toString(), name.getText().toString(), sex.getText().toString(), Integer.valueOf(tel.getText().toString()));
                    if(f.equals("true")){
                       Intent intent=new Intent(register.this,zhucesuccess.class);
                       startActivity(intent);
                       finish();}
                }else{
                Toast.makeText(register.this, "内容不能为空!", Toast.LENGTH_SHORT).show();}
            }catch(Exception e){
                Toast.makeText(register.this, "注册失败,服务器连接错误", Toast.LENGTH_SHORT).show();
                }}});
        }}).start(); 
    login.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent intent=new Intent(register.this,Login.class);
            startActivity(intent);
        }
    });
}

}

就是注册不成功,求大神帮帮忙

我补充一下,我执行register.java的register的click事件后,会报String f=new NetUitl().register(...)空指针,我debug后,发现原来是http.java文件中httppost = new HttpPost(Uri);空指针。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • nwwyjf nwwyjf 5年前

    如果我在主界面里 当我使用到那个联网的操作时 也是一样的用回调?
    我在这方面属于小白 学习中并没有教到这方面就让我们做了

    点赞 评论 复制链接分享
  • daweibalang717 daweibalang717 5年前

    联网是耗时操作,你这样改,会卡死的。比如应用无响应之类的等等。。。

    你应该先理清线程到底是怎么回事。

    1、你这种问题,通常的做法并不是 用返回值 (return strResult;),因为联网 是耗时的,需要异步操作。你可以自己百度学习下。

    2、联网的通常的做法是发消息或者回调。 通俗点讲。 你启动一个线程,说: 线程啊线程,我需要数据,然后你是:
    ①选择什么都不干一直等着它拿回数据呢,②还是告诉它,等数据拿回来再通知我。 明显是选择②方式。所以你可以试着用回调或者handler 拿到联网后
    的数据来刷新UI。

    点赞 评论 复制链接分享
  • nwwyjf nwwyjf 5年前

    如果我把http.java改为:
    public String Post(final String Uri, final List params) throws Exception {

    //设置时间间隔,保证连接顺利
    int timeoutconnection=2000;
    int timeoutsocket=3000;
    HttpParams hp=new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(hp, timeoutconnection);
    HttpConnectionParams.setSoTimeout(hp, timeoutsocket);
    try {
    httpclient = new DefaultHttpClient(hp);//新建httpclient对象, 默认的Http客户端,可以用它来创建HTTP连接
    httppost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
    httppost = new HttpPost(Uri); //新建httppost对象, 传入url

    response = httpclient.execute(httppost); //使用httpclient执行httppost进行联网,返回httpresponse
    if (response.getStatusLine().getStatusCode() == 200) {
    entity = response.getEntity(); // 得到内容
    //Log.i(Uri,strResult);
    strResult = EntityUtils.toString(entity);
    }
    } catch (ClientProtocolException e) {
    e.printStackTrace();// 报错识别
    } catch(IOException e){
    throw new Exception("联网失败");
    }

    return strResult;

    }

        这样有什么问题呢?
    
    点赞 评论 复制链接分享
  • daweibalang717 daweibalang717 5年前

    这破网,怎么点点不动,刷新居然一次这么多条

    点赞 评论 复制链接分享
  • daweibalang717 daweibalang717 5年前

    提问题先描述清楚问题。你这一大堆....
    只能先假设你其他代码是OK的。
    然后,这里:
    public String Post(final String Uri, final List params) { }
    方法中,你去开启了一个线程 去执行联网操作 , 然后直接返回了return strResult;
    联网是耗时 操作,所以你开了一个线程,但是要明白。 你的代码目前执行的顺序是这样的:
    1、调用Post(final String Uri, final List params) 方法
    2、开启线程执行联网
    3、开启线程后,直接返回 return strResult; 而 strResult 此时为null
    4、过了一会儿,当联网成功的时候 ,第二步 中的线程会给 strResult 赋值,但是这个值你并没有用到。

    不造这样描述你能明白不

    点赞 评论 复制链接分享
  • rui888 兔子托尼啊 5年前

    你调试你的 public String Post(final String Uri, final List params) { 这个 里面 看看什么原因。

    点赞 评论 复制链接分享

相关推荐