我尝试通过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 "";
}
}
我尝试使用HttpURLConnection
和URLConnection
,但这些都不会起作用。我已经使用调试来检查代码。该计划在
private String getWebResponse(String urlStr) {
...
InputStream is = httpConn.getInputStream();
....
}
httpConn.getInputStream()
不断返回null
。
请帮助我摆脱困境!
答案 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;
}
}