我正在尝试通过 HTTP 请求从 google 获取数据:
主要
public class MainActivity extends ActionBarActivity {
TextView httpStuff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.httpexample);
httpStuff = (TextView) findViewById(R.id.httpText);
HTTP test = new HTTP();
String returned = null;
try {
returned = test.getInternetData();
httpStuff.setText(returned);
} catch (Exception e) {com
e.printStackTrace();
}
}
}
HTTP 类如下:
public class HTTP {
public String getInternetData() throws Exception{
BufferedReader in = null;
String data = null;
try{
HttpClient client = new DefaultHttpClient();
URI website = new URI("http://www.google.net");
HttpGet request = new HttpGet();
request.setURI(website);
HttpResponse response = client.execute(request);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String l = "";
String nl = System.getProperty("line.separator");
while((l = in.readLine()) !=null){
sb.append(l + nl );
}
in.close();
data = sb.toString();
return data;
}finally {
if (in != null){
try{
in.close();
return data;
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
这是控制台 logcat:
04-27 19:31:58.063 2167-2191/com.example.briesanji.test D/OpenGLRenderer﹕ Render dirty regions requested: true 04-27 19:31:58.065 2167-2167/com.example.briesanji.test D/﹕ HostConnection::get() New Host Connection established 0xa687c600, tid 2167 04-27 19:31:58.103 2167-2167/com.example.briesanji.test D/Atlas﹕ Validating map... 04-27 19:31:58.196 2167-2191/com.example.briesanji.test D/﹕ HostConnection::get() New Host Connection established 0xa687c7c0, tid 2191 04-27 19:31:58.207 2167-2191/com.example.briesanji.test I/OpenGLRenderer﹕ Initialized EGL, version 1.4 04-27 19:31:58.283 2167-2191/com.example.briesanji.test D/OpenGLRenderer﹕ Enabling debug mode 0 04-27 19:31:58.334 2167-2191/com.example.briesanji.test W/EGL_emulation﹕ eglSurfaceAttrib not implemented 04-27 19:31:58.334 2167-2191/com.example.briesanji.test W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6868780, error=EGL_SUCCESS
TextView 不显示数据但保留其默认文本(“加载数据”)
我已经尝试将 httpStuff.setText(returned);
更改为 httpStuff.setText("hello");
但没有,所以我认为这是布局问题然后我拉了从 try 方法中输出 httpStuff.setText("hello");
并显示 Hello.. 所以问题当然是 try 方法,但我不知道我错在哪里
最佳答案
您的代码无法正常工作,因为它试图在其主线程上执行网络操作。为此,您会收到 NetworkOnMainThreadException
解决此问题的最简单方法是使用 AsyncTask
:
public class SampleActivity extends Activity {
TextView httpStuff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
httpStuff = (TextView) findViewById(R.id.add_button);
new DownloadInternetData().execute();
}
public class DownloadInternetData extends AsyncTask<Void, Void, String>{
@Override
protected String doInBackground(Void... voids) {
BufferedReader in = null;
String data = null;
try {
HttpClient client = new DefaultHttpClient();
URI website = new URI("http://www.google.net");
HttpGet request = new HttpGet();
request.setURI(website);
HttpResponse response = client.execute(request);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String l = "";
String nl = System.getProperty("line.separator");
while ((l = in.readLine()) != null) {
sb.append(l + nl);
}
in.close();
data = sb.toString();
return data;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
return data;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "";
}
@Override
protected void onPostExecute(String result) {
httpStuff.setText(result);
}
}
}
关于android - Http 数据未显示在我的 TextView [android],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29904671/