【问题标题】:Android : Send/receive dataAndroid:发送/接收数据
【发布时间】:2017-04-11 06:05:20
【问题描述】:
package demo.chv.bhudev.chvlogin;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

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 java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

public class MainActivity extends AppCompatActivity {
TextView content;
EditText login, pass;
String Login, Pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    login      =    (EditText)findViewById(R.id.txt_box_usr);
    pass       =   (EditText)findViewById(R.id.txt_box_pwd);
    content    =   (TextView)findViewById( R.id.txt_content);

    Button save = (Button)findViewById(R.id.btn_login);
    save.setOnClickListener(new Button.OnClickListener(){

        @Override
        public void onClick(View v)
        {
            try{
                // CALL GetText method to make post method call
                GetText();
            }
            catch(Exception ex)
            {
                content.setText(ex.getMessage());
            }
        }
    });
}

private void GetText() throws UnsupportedEncodingException{
    Login = login.getText().toString();
    Pass = pass.getText().toString();

    Toast.makeText(this,"Started",Toast.LENGTH_LONG).show();
    String data = URLEncoder.encode("username", "UTF-8")
            + "=" + URLEncoder.encode(Login, "UTF-8");

    data += "&" + URLEncoder.encode("password", "UTF-8") + "="
            + URLEncoder.encode(Pass, "UTF-8");

    String text = "";
    try{
        URL url = new URL("mylink");
        URLConnection conn = url.openConnection();

        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data);
        wr.flush();

        StringBuilder  sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        while ((text = reader.readLine()) != null){
            sb.append(text);
            break;
        }
        content.setText(sb);
    }catch(Exception r)    {    Toast.makeText(this,r.getMessage().toString(),Toast.LENGTH_LONG).show();
    }
}
}

对于上述代码,我收到异常“尝试在空对象引用上调用虚拟方法 'java.lang.String java.lang.toString()'”。

我在网上尝试/搜索了很多东西,但找不到解决方法。

【问题讨论】:

  • 你在哪一行得到这个异常?
  • 请添加完整的活动代码。
  • 也粘贴你的logcat
  • 错误:OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

标签: java android httpclient


【解决方案1】:

更改以下代码:

Toast.makeText(this,r.getMessage().toString(),Toast.LENGTH_LONG).show();

Toast.makeText(this,r.getMessage(),Toast.LENGTH_LONG).show();

以下是Oracle文档中对getMessage函数的描述:

getMessage

public String getMessage()

Returns the detail message string of this throwable.
Returns:the detail message string of this Throwable instance (which may be null).

因此,您可能会得到 null

另外,更改以下代码:

 Login = login.getText().toString();
Pass = pass.getText().toString();

到:

if(login.getText()!=null)
    Login = login.getText().toString();
if(pass.getText()!=null)
        Pass = pass.getText().toString();

【讨论】:

    【解决方案2】:

    您的登录或传递对象,我认为是 edittext 视图,在运行此方法之前尚未初始化。这给出了“在空对象引用上”的错误

    【讨论】:

      【解决方案3】:

      您需要设置哪种请求方法类型您的调用,如 POST 或 GET 调用,所以试试这个

       urlConnection = (HttpURLConnection) url.openConnection();
          urlConnection.setDoOutput(true);
          urlConnection.setRequestMethod("POST");
          urlConnection.setRequestProperty("Authorization", "Basic " + base64Encoded);
          urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
          PrintWriter out = new PrintWriter(urlConnection.getOutputStream());
          out.print(_param);
          out.close();
      
          int statusCode = urlConnection.getResponseCode();
      
          if (statusCode == 200) {
              inputStream = new BufferedInputStream(urlConnection.getInputStream());
      
              try {
                  sb = new StringBuilder();
                  BufferedReader r = new BufferedReader(new InputStreamReader(
                          _instream));
                  for (String line = r.readLine(); line != null; line = r.readLine()) {
                      sb.append(line);
                  }
      
                  _instream.close();
      
              } catch (IOException e) {
                  System.out.println(e.getMessage());
              }
              //  sb.toString() use where you want
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-13
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        相关资源
        最近更新 更多