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个回答

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

提问题先描述清楚问题。你这一大堆....
只能先假设你其他代码是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 赋值,但是这个值你并没有用到。

不造这样描述你能明白不

nwwyjf
nwwyjf 代码 我该具体怎么改呢?
4 年多之前 回复
nwwyjf
nwwyjf 也就是说 我的顺序是有问题的,第2步骤后面应该是你说的第4步骤 然后才是第3步骤?
4 年多之前 回复
nwwyjf
nwwyjf 我试试
4 年多之前 回复
daweibalang717
daweibalang717 回复daweibalang717: 和 return strResult; 这两次地方,加上 日志输出。
4 年多之前 回复
daweibalang717
daweibalang717 回复daweibalang717: 和 return strResult; 这两次地方,加上 日志输出。
4 年多之前 回复
daweibalang717
daweibalang717 回复daweibalang717: 和 return strResult; 这两次地方,加上 日志输出。
4 年多之前 回复
daweibalang717
daweibalang717 回复daweibalang717: 和 return strResult; 这两次地方,加上 日志输出。
4 年多之前 回复
daweibalang717
daweibalang717 你可以在 strResult = EntityUtils.toString(response.getEntity());
4 年多之前 回复

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

如果我把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;

}

    这样有什么问题呢?

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

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

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

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

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

daweibalang717
daweibalang717 并不了解你的程序具体适用情况,但大部分都是异步调用的。其他的自己百度搜搜吧。你得学会自己解决问题。 学习中还好,工作别人帮你也只是提示或者思路,没有手把手教的。
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐