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,所以我必须实现另一个线程来解决这个问题?我会尽力把结果告诉你。谢谢