一周前(2014 年 2 月)我使用 Eclipse 下载了最新的 Android SDK。我是新手,但对 Java 编程并不笨,但这个问题简直要了我的命。
我试图做一个关于从互联网下载文件的简单教程。在经历了几次教程失败后,我终于得到了这个。但在模拟器中该应用程序无法连接到互联网。我添加了简单的
TextView
标志来追踪问题,并且始终是 httpConn.connect();
。
最棒的是 – 当这个应用程序安装到我的 Samsung Galaxy Y (GT-S5360) 上时,它可以正常工作。
在 SDK Manager 中安装了 Google Web Driver – 模拟器浏览器连接到互联网。 但无论我做什么,模拟器就是不允许我的应用程序连接。
是的,
uses-permission android:name="android.permission.INTERNET" />
存在。
是的,有 3G 网络。
是的,文件链接拼写正确。
不,每次将应用程序手动安装到实际设备上对于我正在做的工作来说并不是一个好的解决方案。
PC 使用有线互联网连接。在 Windows7 64 位(有或没有管理员权限)上尝试了模拟器,在 WindowsXP 32 位上尝试了 32 位 Android SDK 模拟器。重新启动 Eclipse。重新下载了SDK。重新启动电脑。尝试了很多建议,包括“-dns-server 8.8.8.8,8.8.4.4”。全部无法连接
httpConn.connect();
。
代码很好,很简单。新下载的新 Android SDK 模拟器缺少什么?!
复制步骤:
1)从官方网站下载最新的Android SDK。
2) 运行 SDK 管理器并安装默认建议 + Google Web 驱动程序
3) 根据本教程创建应用程序: http://www.edumobile.org/android/android-beginner-tutorials/downloading-an-image-from-the-server-and-displaying-it-on-screen/
4) 作为 Android 应用程序运行应用程序 – 由于
httpConn.connect();
失败而出现白屏。
以下是升级后的LogCat错误报告:
D/dalvikvm(933): Not late-enabling CheckJNI (already on)
W/System.err(933): java.io.IOException: Error connecting
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.OpenHttpConnection(downloadImage.java:70)
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.DownloadImage(downloadImage.java:83)
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.onCreate(downloadImage.java:24)
W/System.err(933): at android.app.Activity.performCreate(Activity.java:5231)
W/System.err(933): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
W/System.err(933): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
W/System.err(933): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
W/System.err(933): at android.app.ActivityThread.access$800(ActivityThread.java:135)
W/System.err(933): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
W/System.err(933): at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err(933): at android.os.Looper.loop(Looper.java:136)
W/System.err(933): at android.app.ActivityThread.main(ActivityThread.java:5017)
W/System.err(933): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(933): at java.lang.reflect.Method.invoke(Method.java:515)
W/System.err(933): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
W/System.err(933): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
W/System.err(933): at dalvik.system.NativeStart.main(Native Method)
W/System.err(933): Caused by: android.os.NetworkOnMainThreadException
W/System.err(933): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
W/System.err(933): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
W/System.err(933): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
W/System.err(933): at java.net.InetAddress.getAllByName(InetAddress.java:214)
W/System.err(933): at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
W/System.err(933): at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
W/System.err(933): at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
W/System.err(933): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
W/System.err(933): at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
W/System.err(933): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
W/System.err(933): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
W/System.err(933): at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.OpenHttpConnection(downloadImage.java:54)
W/System.err(933): ... 16 more
D/gralloc_goldfish(933): Emulator without GPU emulation detected.
谢谢你给了我一根救命稻草。得到
Caused by: android.os.NetworkOnMainThreadException
后,我将问题追溯到 AsyncTask 实现。事实证明,模拟器不喜欢您在一个类中使用所有 Internet 进程。因此,在浏览其他示例后,我最终将教程分为两类。
package com.example.testfiledownlaod3;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
public class downloadImage extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView img = (ImageView) findViewById(R.id.imageView1);
String URL = "http://www.allindiaflorist.com/imgs/arrangemen4.jpg";
img.setTag(URL);
new DownloadImageTask().execute(img);
}
}
和
package com.example.testfiledownlaod3;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
public class DownloadImageTask extends AsyncTask<ImageView, Void, Bitmap>
{
ImageView imageView = null;
@Override
protected Bitmap doInBackground(ImageView... imageViews)
{
this.imageView = imageViews[0];
return download_Image((String)imageView.getTag());
}
private Bitmap download_Image(String url)
{
Bitmap bmp=null;
try
{
URL ulrn = new URL(url);
HttpURLConnection con = (HttpURLConnection)ulrn.openConnection();
InputStream instr = con.getInputStream();
bmp = BitmapFactory.decodeStream(instr);
instr.close();
}
catch (Exception ex){}
return bmp;
}
@Override
protected void onPostExecute(Bitmap result)
{
imageView.setImageBitmap(result);
}
}
适用于模拟器和我的 Samsung Galaxy Y (GT-S5360)