Android从网络获取数据

时间:2017-08-31 03:39:41

标签: android networking

我尝试通过Android手机阅读远程服务器上的文本文件中的内容。该文件的网址为192.168.43.157:8080/apk/list.txt,我已经通过在PC上使用我的浏览器测试了该服务器运行良好,并将该网址粘贴到地址栏中。

我添加了使用权限:

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
    ...

这是Activity

中的代码
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    String listUrl = "http://192.168.43.157:8080/apk/list.txt";

    String response = getWebResponse(listUrl);
    TextView textView = (TextView) findViewById(R.id.web_response);
    textView.setText(response);

}

private String getWebResponse(String urlStr) {
    try {
        URL url = new URL(urlStr);
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setRequestMethod("GET");
        httpConn.setDoInput(true);
        InputStream is = httpConn.getInputStream();
        InputStreamReader isr = new InputStreamReader(is, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        StringBuilder response = new StringBuilder();
        String line = null;
        while((line = br.readLine()) != null) {
            response.append(line);
        } 
        return response.toString();
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }

}

我尝试使用HttpURLConnectionURLConnection,但这些都不会起作用。我已经使用调试来检查代码。该计划在

失败
private String getWebResponse(String urlStr) {
    ...
    InputStream is = httpConn.getInputStream();
    ....
}

httpConn.getInputStream()不断返回null

请帮助我摆脱困境!

3 个答案:

答案 0 :(得分:1)

我建议你使用一些易于使用的库 例如使用volley库(通过谷歌)

示例:

    // Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
       // get the response 
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
       // error msg
    }
});
// Add the request to the RequestQueue.
queue.add(stringRequest);

顺便说一下,如果你使用的是模拟器,你应该把这个ip地址10.0.2.2

答案 1 :(得分:1)

此代码适用于我。

        URL url;
        HttpURLConnection urlConnection = null;
        StringBuilder result = new StringBuilder();
        BufferedReader reader = null;

       urlConnection = (HttpURLConnection) url
                        .openConnection();
                urlConnection.connect();

                InputStream in = urlConnection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(in));
                //InputStreamReader isw = new InputStreamReader(in);
                StringBuffer buffer = new StringBuffer();
                String line ="";
                while ((line = reader.readLine()) != null){
                    buffer.append(line);
                }

                String finalJson = buffer.toString();

答案 2 :(得分:0)

事实是,你只是不能使用主线程从web获取内容,我必须使用“AsyncTask”。虽然我不明白为什么它应该是,但在我将进程包装在AsyncTask类中后,该程序可以工作。当我尝试将文件上传到服务器时,我遇到了同样的问题。但是,当我尝试使用主线程上传或下载时,程序会抛出不同的错误。

没有淀粉,我会粘贴我所做的。

public class TestActivity extends Activity {

private TextView remoteContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    String listUrl = "http://192.168.43.157:8080/apk/list.txt";
    remoteContent = (TextView) findViewById(R.id.web_response);
    //String response = getWebResponse(listUrl);
    //TextView textView = (TextView) findViewById(R.id.web_response);
    //textView.setText(response);

    GetApksListTask task = new GetApksListTask();
    task.execute(new String[]{listUrl});
}


private class GetApksListTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]); 
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setRequestMethod("GET");
            InputStream is = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
            BufferedReader br = new BufferedReader(isr);
            StringBuilder response = new StringBuilder();
            String line = null;
            while((line = br.readLine()) != null) {
                response.append(line);
            } 
            return response.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    @Override
    protected void onPostExecute(String response) {
        remoteContent.setText(response);

        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is    present.
        getMenuInflater().inflate(R.menu.test, menu);
        return true;
    }
}