【问题标题】:Android HttpURLConnection connecting error only on hardware devices (not in emulators)Android HttpURLConnection 仅在硬件设备上连接错误(不在模拟器中)
【发布时间】:2015-07-08 22:31:29
【问题描述】:

我是 android 开发的新手,我正在寻找一种将图片和文本从互联网下载到我的应用程序的方法。我找到了一些教程并将代码包含在我的项目中。当我在模拟器上运行应用程序时,一切正常。如果我在我的设备(三星 Galaxy S4)上运行该应用程序,我会收到“连接错误”(在 HttpDownload.java 中),我不知道为什么,因为在其他应用程序中互联网正在运行。

感谢您的帮助。

代码如下:

HttpDownload.java:

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class HttpDownload extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    private InputStream OpenHttpConnection(String urlString)
            throws IOException
    {
        InputStream in = null;
        int response = -1;

        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();

        if (!(conn instanceof HttpURLConnection))
            throw new IOException("Not an HTTP connection");

        try{
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();

            response = httpConn.getResponseCode();
            if (response == HttpURLConnection.HTTP_OK) {
                in = httpConn.getInputStream();
            }
        }
        catch (Exception ex)
        {
            throw new IOException("Error connecting");
        }
        return in;
    }

    public Bitmap DownloadImage(String URL)
    {
        Bitmap bitmap = null;
        InputStream in = null;
        try {
            in = OpenHttpConnection(URL);
            bitmap = BitmapFactory.decodeStream(in);
            in.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return bitmap;
    }

    public String DownloadText(String URL)
    {
        int BUFFER_SIZE = 2000;
        InputStream in = null;
        try {
            in = OpenHttpConnection(URL);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return "";
        }

        InputStreamReader isr = new InputStreamReader(in);
        int charRead;
        String str = "";
        char[] inputBuffer = new char[BUFFER_SIZE];
        try {
            while ((charRead = isr.read(inputBuffer))>0)
            {
                //---convert the chars to a String---
                String readString =
                        String.copyValueOf(inputBuffer, 0, charRead);
                str += readString;
                inputBuffer = new char[BUFFER_SIZE];
            }
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "";
        }
        return str;
    }

}

main_activity:

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    TextView meinText;
    ImageView meinBild;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        meinBild = (ImageView)findViewById(R.id.meinBild);
        meinText = (TextView)findViewById(R.id.meinText);
    }

    public void laden (View view) {
        HttpDownload download = new HttpDownload();
        meinBild.setImageBitmap(download.DownloadImage("http://www.queness.com/resources/images/png/apple_ex.png"));
    }

}

Logcat:

    Local Branch:
    Remote Branch:
    Local Patches:
    Reconstruct Branch:
04-29 16:36:28.757  32038-32038/com.example.itsme.internetdaten D/OpenGLRenderer﹕ Enabling debug mode 0
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ java.io.IOException: Error connecting
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at com.example.itsme.internetdaten.HttpDownload.OpenHttpConnection(HttpDownload.java:50)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at com.example.itsme.internetdaten.HttpDownload.DownloadImage(HttpDownload.java:60)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at com.example.itsme.internetdaten.MainActivity.laden(MainActivity.java:29)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at android.view.View$1.onClick(View.java:3964)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at android.view.View.performClick(View.java:4633)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at android.view.View$PerformClick.run(View.java:19330)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at android.os.Looper.loop(Looper.java:157)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5356)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
04-29 16:36:53.862  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
04-29 16:36:53.882  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
04-29 16:36:53.882  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
04-29 16:36:53.882  32038-32038/com.example.itsme.internetdaten W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
04-29 16:36:53.882  32038-32038/com.example.itsme.internetdaten I/Choreographer﹕ Skipped 61 frames!  The application may be doing too much work on its main thread.

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.itsme.internetdaten" >

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

【问题讨论】:

标签: android httpurlconnection androidhttpclient


【解决方案1】:

改变:

  catch (Exception ex)
        { 
            throw new IOException("Error connecting");
        } 

到

catch (Exception ex)
        { 
           Log.d("error", ex.toString());
        } 

并分享发生的确切异常

还可以从互联网下载图像,您可以简单地使用:

 URL url = new URL(address);
 Object content = url.getContent();

第三,可能是您没有活动的互联网连接而引发异常。

【讨论】:

  • 谷歌搜索后 android.os.NetworkOnMainThreadException 向我展示了这篇文章stackoverflow.com/questions/6343166/…,它说我应该把它放在一个 AsyncTask 中。我马上试试
  • 网络调用永远不能在主线程上。这对于 Android 操作系统非常重要。如果一切正常,您可以将其标记为已接受。
【解决方案2】:
  HttpDownload download = new HttpDownload();

由于 HttpDownload 是一个 Activity,你不能以这种方式实例化它。您必须使用 Intent 来启动 Activity。

【讨论】:

    【解决方案3】:

    所以问题是网络调用在 Main_Activity(一个 UI 活动)中。就像凯已经说过的那样,这不再起作用了。为什么它在我的模拟器中工作很简单:他使用的是 Android 2.3,这是可能的。

    更多信息:

    http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html

    How to fix android.os.NetworkOnMainThreadException?

    我更改了我的代码,一切正常:

    下载.java

    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    
    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 java.util.concurrent.ExecutionException;
    
    public class Download {
    
        public Bitmap downloadBild (String URL) {
            Bitmap bild;
            try {
                bild = new DownloadBildTask().execute(URL).get();
            } catch (InterruptedException e) {
                bild = null;
            } catch (ExecutionException e) {
                bild = null;
            }
            return bild;
        }
    
        public String downloadText (String URL) {
            String ergebnis;
            try {
                ergebnis = new DownloadTextTask().execute(URL).get();
            } catch (InterruptedException e) {
                ergebnis = "Keine Daten";
            } catch (ExecutionException e) {
                ergebnis = "Keine Daten";
            }
            return ergebnis;
        }
    
        private class DownloadTextTask extends AsyncTask<String, Void, String> {
            @Override
            protected String doInBackground(String... urls) {
                try {
                    InputStream inputStream = downloadInhalt(urls[0]);
                    String Text = InputStreamToString(inputStream);
                    inputStream.close();
                    return Text;
    
                } catch (IOException e) {
                    return "Unable to retrieve web page. URL may be invalid.";
                }
            }
        }
    
        private class DownloadBildTask extends AsyncTask<String, Void, Bitmap> {
            @Override
            protected Bitmap doInBackground(String... urls) {
                try {
                    InputStream inputStream = downloadInhalt(urls[0]);
                    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                    inputStream.close();
                    return bitmap;
    
                } catch (IOException e) {
                    return null;
                }
            }
        }
    
        private InputStream downloadInhalt(String myurl) throws IOException {
            InputStream is;
    
            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);
                conn.connect();
                is = conn.getInputStream();
                return is;
            } catch (Exception e) {
                return null;
            }
        }
    
        private String InputStreamToString(InputStream stream) throws IOException {
            BufferedReader r = new BufferedReader(new InputStreamReader(stream));
            StringBuilder total = new StringBuilder();
            String line;
            while ((line = r.readLine()) != null) {
                total.append(line);
            }
            return total.toString();
        }
    
    }
    

    Main_Activity

    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    
    public class MainActivity extends ActionBarActivity {
    
        TextView meinText;
        ImageView meinBild;
        Download download = new Download();
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            meinBild = (ImageView)findViewById(R.id.meinBild);
            meinText = (TextView)findViewById(R.id.meinText);
        }
    
        public void textLaden(View view) {
            String stringUrl = "http://www.openligadb.de/api/getmatchdata/bl1/2014/15";
            meinBild.setImageBitmap(null);
            meinText.setText(download.downloadText(stringUrl));
        }
    
        public void bildLaden(View view) {
            String stringUrl = "http://www.queness.com/resources/images/png/apple_ex.png";
            meinText.setText("");
            meinBild.setImageBitmap(download.downloadBild(stringUrl));
        }
    
    }
    

    在清单中:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    感谢您的帮助

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 2014-05-02
      • 1970-01-01
      • 2014-08-12
      • 2020-01-16
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多