Java 在Android中连接和下载数据
我上网和下载数据有问题;你能帮我理解我的错误吗?我发布代码:Java 在Android中连接和下载数据,java,android,download,android-xml,connect,Java,Android,Download,Android Xml,Connect,我上网和下载数据有问题;你能帮我理解我的错误吗?我发布代码: public class MainActivity extends Activity implements OnClickListener{ private static final String DEBUG_TAG = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sa
public class MainActivity extends Activity implements OnClickListener{
private static final String DEBUG_TAG = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String DEBUG_TAG = "HttpExample";
//Assegno le View
Button bottone = (Button) findViewById(R.id.button);
TextView insert = (TextView) findViewById(R.id.inserisci);
bottone.setOnClickListener(this);
}
@Override
public void onClick(View v) {
TextView data = (TextView)findViewById(R.id.content);
EditText edit = (EditText)findViewById(R.id.edit);
//Assegna alla stringa sito il testo preso dall'EditText
String sito = edit.getText().toString();
try {
//Setta nella TextView i 500 caratteri del contenuto della web page
data.setText(downloadUrl(sito));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/* Dato un URL, stabilisce un HttpUrlConnection e restituisce il contenuto della web page
come un InputStream, che è ritornato come stringa.*/
public String downloadUrl(String myurl) throws IOException {
InputStream is = null;
//Mostra solo i primi 500 caratteri del contenuto della web page.
int len = 500;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* millisecondi */);
conn.setConnectTimeout(15000 /* millisecondi */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(true);
// Inizializza la connessione
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG, "The response is: " + response);
is = conn.getInputStream();
// Converte l'InputStream in una stringa
String contentAsString = readIt(is, len);
return contentAsString;
// Si assicura che l'InputStream sia chiuso dopo che l'app ha finito di usarlo
} finally {
if (is != null) {
is.close();
}
}
}
// Legge un InputStream e lo converte in una stringa
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
Reader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}
}
XML文件是:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/inserisci"
android:text="@string/inserisci"
android:layout_width="wrap_content"/>
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"/>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:text="@string/button"
android:layout_width="wrap_content"
android:layout_marginLeft="80dp"
android:layout_gravity="center"/>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<TextView
android:text=""
android:id="@+id/content"/>
</TableRow>
</TableLayout>
多亏了@robmeeuwise,我才解决了这个问题。这是正确的代码:
public class MainActivity extends Activity {
private static final String DEBUG_TAG = "HttpExample";
private EditText urlText;
private TextView textView;
private Button bt;
private TextView advice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
urlText = (EditText)findViewById(R.id.myUrl);
textView = (TextView)findViewById(R.id.myText);
advice = (TextView)findViewById(R.id.advice);
bt = (Button)findViewById(R.id.button);
bt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
myClickHandler(v);
}
});
}
//Quando l'utente clicca sul bottone,chiama AsycTask; prima di decodificare l'URL si assicura che ci sia la connessione alla rete
public void myClickHandler(View view){
//Prende l'URL dall'EditText
String stringUrl = urlText.getText().toString();
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo net = connMgr.getActiveNetworkInfo();
if(net != null && net.isConnected()){
new DownloadWebpageTask().execute(stringUrl);
}else{
textView.setText("No network connection available.");
}
}
/*Usa AsyncTask per creare un task fuori dal thread principale della UI. Questo task prende una stringa URL e la usa per
creare un HttpUrlConnection. Una volta che la connessione è stata creata, l'AsyncTask scarica il contenuto della webpage come un InputStream
e lo converte in String con è il metodo onPostExecute. */
private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls){
try{
return downloadUrl(urls[0]);
}catch (IOException e){
return "Impossibile trovare la pagina web. L'URL inserito potrebbe essere invalido.";
}
}
protected void onPostExecute(String result){
textView.setText(result);
}
}
private String downloadUrl(String myurl) throws IOException {
InputStream is = null;
// Visualizza i primi 500 caratteri del contenuto della web page
int len = 500;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Inizializza la connessione
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG, "The response is: " + response);
is = conn.getInputStream();
// Converte l'InputStream in una stringa
String contentAsString = readIt(is, len);
return contentAsString;
// Si assicura di chiudere l'InputStream una volta che l'app ha smesso di usarlo
} finally {
if (is != null) {
is.close();
}
}
}
//输入流和输出流的转换。
公共字符串readItInputStream,int len抛出IOException,UnsupportedEncodingException{
Reader=null;
reader=新的InputStreamReaderstream,UTF-8;
char[]buffer=新字符[len];
reader.readbuffer;
返回新的字符串缓冲区;
}
}您遇到的错误是什么?你能发布堆栈跟踪或描述问题吗?嗨,谢谢你的回答!当必须从方法downloadUrl返回字符串时,应用程序崩溃;我还不明白这个问题。我从API复制了downloadUrl方法。注意:我打赌您会收到一个异常,说明您无法在主UI线程上执行http。如果是这种情况,您需要阅读背景线程主题。Android开发者培训网站有一个不错的@RobMeeuwisse,所以我必须实现另一个线程来解决这个问题?我会尽力把结果告诉你。谢谢