Android从web获取数据

Android从web获取数据,android,networking,Android,Networking,我试图通过安卓手机读取远程服务器上文本文件中的内容。该文件的URL是192.168.43.157:8080/apk/list.txt,我在PC上使用浏览器并将URL粘贴到地址栏中,测试了服务器是否正常工作 我已添加使用权限: <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.

我试图通过安卓手机读取远程服务器上文本文件中的内容。该文件的URL是
192.168.43.157:8080/apk/list.txt
,我在PC上使用浏览器并将URL粘贴到地址栏中,测试了服务器是否正常工作

我已添加使用权限:

<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
    ...
我尝试过使用
HttpURLConnection
URLConnection
,这两种方法都不起作用。我已经使用调试来检查代码。程序在运行时失败

private String getWebResponse(String urlStr) {
    ...
    InputStream is = httpConn.getInputStream();
    ....
}
httpConn.getInputStream()
不断返回
null


请帮我摆脱困境

我建议您使用一些简单的库 例如使用图书馆(由谷歌提供)

例如:

    // 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);
//实例化RequestQueue。
RequestQueue=Volley.newRequestQueue(this);
字符串url=”http://www.google.com";
//从提供的URL请求字符串响应。
StringRequest StringRequest=新的StringRequest(Request.Method.GET,url,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
//得到回应
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//错误消息
}
});
//将请求添加到RequestQueue。
添加(stringRequest);


顺便说一下,如果您使用的是emulator,您应该将这个ip地址设置为
10.0.2.2

我建议您使用一些使其更简单的库 例如使用图书馆(由谷歌提供)

例如:

    // 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);
//实例化RequestQueue。
RequestQueue=Volley.newRequestQueue(this);
字符串url=”http://www.google.com";
//从提供的URL请求字符串响应。
StringRequest StringRequest=新的StringRequest(Request.Method.GET,url,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
//得到回应
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//错误消息
}
});
//将请求添加到RequestQueue。
添加(stringRequest);


顺便说一下,如果您使用的是emulator,您应该将这个ip地址设置为
10.0.2.2

这个代码适合我

        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();

这个代码对我有用

        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();

事实上,您不能使用主线程从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;
    }
}
公共类测试活动扩展活动{
私有文本视图远程内容;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_测试);
字符串listUrl=”http://192.168.43.157:8080/apk/list.txt";
remoteContent=(TextView)findViewById(R.id.web\u响应);
//字符串响应=getWebResponse(listUrl);
//TextView TextView=(TextView)findViewById(R.id.web\u响应);
//setText(响应);
GetApksListTask=新建GetApksListTask();
执行(新字符串[]{listUrl});
}
私有类GetApksListTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
试一试{
URL=新URL(URL[0]);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoInput(真);
conn.setRequestMethod(“GET”);
InputStream is=conn.getInputStream();
InputStreamReader isr=新的InputStreamReader(即“UTF-8”);
BufferedReader br=新的BufferedReader(isr);
StringBuilder响应=新建StringBuilder();
字符串行=null;
而((line=br.readLine())!=null){
响应。追加(行);
} 
返回response.toString();
}捕获(例外e){
e、 printStackTrace();
返回“”;
}
}
@凌驾
受保护的void onPostExecute(字符串响应){
remoteContent.setText(响应);
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.test,menu);
返回true;
}
}

事实是,您不能使用主线程从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;
    }
}
公共类测试活动扩展活动{
私有文本视图远程内容;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_测试);
字符串listUrl=”http://192.168.43.157:8080/apk/list.txt";
remoteContent=(TextView)findViewById(R.id.web\u响应);
//字符串响应=getWebResponse(listUrl);
//TextView TextView=(TextView)findViewById(R.id.web\u响应);
//setText(响应);
GetApksListTask=新建GetApksListTask();
执行(新字符串[]{listUrl});
}
私有类GetApksListTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
试一试{
URL=新URL(URL[0]);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoInput(真);