[英]Cannot get GET request working for Android
我试图向我的本地NodeJS服务器发出一个简单的GET请求来获取一些JSON对象。 我更改了请求,因此它发生在AsyncTask而不是UI线程中。 但我仍然无法让它发挥作用。 这段代码看起来是否正确? 对不起,Java还不是很好。
package com.dd.relay;
import com.dd.relay.HttpRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
public final static String EXTRA_MESSAGE = "com.dd.relay.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We'll define a custom screen layout here (the one shown above), but
// typically, you could just use the standard ListActivity layout.
setContentView(R.layout.activity_main);
// Make a GET request for data
String url = "http://localhost.com/contacts";
String res = null;
try {
HttpRequest request = new HttpRequest();
request.execute(new URL(url));
Log.v(EXTRA_MESSAGE, res);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
TextView textView = (TextView) findViewById(R.id.textv);
Context context = this.getApplicationContext();
Toast mytoast = Toast.makeText(context, res, Toast.LENGTH_LONG);
mytoast.show();
textView.setText(res);
// Create list for contacts
/* List<Map<String, RelayContact>> data = null;
// Now create a new list adapter bound to the cursor.
// SimpleListAdapter is designed for binding to a Cursor.
ListAdapter adapter = new SimpleAdapter(this, data, 0, new String[] {"First", "Number"}, new int[] {android.R.id.text1, android.R.id.text2}); // Parallel array of which template objects to bind to those columns.
// Bind to our new adapter.
this.setListAdapter(adapter);*/
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
这是我自定义的HttpRequest AsyncTask类
package com.dd.relay;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.AsyncTask;
public class HttpRequest extends AsyncTask<URL, Void, Void> {
protected String doInBackground(URL url) throws Exception {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn.getResponseCode() != 200) {
throw new IOException(conn.getResponseMessage());
}
// Buffer the result into a string
BufferedReader rd = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
return sb.toString();
}
protected void onProgressUpdate(Integer progress) {
}
protected void onPostExecute(String result) {
System.out.println(result);
}
@Override
protected Void doInBackground(URL... arg0) {
// TODO Auto-generated method stub
return null;
}
}
Android不允许在UI线程上进行网络通信。 Android提供了一个名为AsyncTask
的类,用于此类交互。 有关详细信息和解决方案的一个选项,请参阅此链接(这可能是您想要的):
如何修复android.os.NetworkOnMainThreadException?
或者您也可以创建一个自定义类来扩展Thread
或实现Runnable
,它使用Handler
发布到UI线程
试试这个链接希望对你充分利用: -
public class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// call function
login(userName, password);
return null;
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.