【问题标题】:application not working on android 4.0应用程序无法在 android 4.0 上运行
【发布时间】:2012-05-09 07:24:41
【问题描述】:

我的程序从 android 2.1 到 android 2.3 运行良好

但它不适用于更高版本的android

我在清单文件中使用过

<uses-sdk android:minSdkVersion="7"  
      android:targetSdkVersion="10" 
           android:maxSdkVersion="15"/>

在 android 4.0.3 avd 上运行项目时出现 Logcat 输出错误导致

05-09 12:45:12.051:E/AndroidRuntime(530):致命异常:main` 05-09 12:45:12.051: E/AndroidRuntime(530): java.lang.RuntimeException: 无法启动活动 ComponentInfo{giv.home/giv.home.Start}: android.os.NetworkOnMainThreadException 05-09 12:45:12.051: E/AndroidRuntime(530):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 android.app.ActivityThread.access$600(ActivityThread.java:123) 05-09 12:45:12.051:E/AndroidRuntime(530):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 android.os.Handler.dispatchMessage(Handler.java:99) 05-09 12:45:12.051:E/AndroidRuntime(530):在 android.os.Looper.loop(Looper.java:137) 05-09 12:45:12.051: E/AndroidRuntime(530):在 android.app.ActivityThread.main(ActivityThread.java:4424) 05-09 12:45:12.051:E/AndroidRuntime(530):在 java.lang.reflect.Method.invokeNative(Native Method) 05-09 12:45:12.051:E/AndroidRuntime(530):在 java.lang.reflect.Method.invoke(Method.java:511) 05-09 12:45:12.051: E/AndroidRuntime(530):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 05-09 12:45:12.051:E/AndroidRuntime(530):在 dalvik.system.NativeStart.main(本机方法)05-09 12:45:12.051: E/AndroidRuntime(530):由以下原因引起: android.os.NetworkOnMainThreadException 05-09 12:45:12.051: E/AndroidRuntime(530):在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:391) 05-09 12:45:12.051:E/AndroidRuntime(530):在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 05-09 12:45:12.051:E/AndroidRuntime(530):在 java.net.InetAddress.getAllByName(InetAddress.java:220) 05-09 12:45:12.051:E/AndroidRuntime(530):在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 giv.home.ConnectionClass.connectToServer(ConnectionClass.java:41) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 giv.home.Start.onCreate(Start.java:64) 05-09 12:45:12.051: E/AndroidRuntime(530):在 android.app.Activity.performCreate(Activity.java:4465) 05-09 12:45:12.051:E/AndroidRuntime(530):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 05-09 12:45:12.051: E/AndroidRuntime(530): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 05-09 12:45:12.051: E/AndroidRuntime(530): ... 11 更多

【问题讨论】:

标签: android


【解决方案1】:

我认为这是因为您尝试在主线程中使用 HTTPConnect...Android 不再支持在主线程中使用 HTTP,并且要求您在后台线程中执行此操作。只是猜测,当然……但这就是我怀疑正在发生的事情。

但是,如果您的目标 SDK 版本是 10,那么为什么不直接跳过设置最大值呢?我的意思是……你认为 ICS 是你的应用程序可以运行的绝对最高级别是什么?我相信 min 和 target 是完全足够的。设置 Max 的目的是(例如)您的应用程序将无法安装在 ICS 上,因为 ICS 可用并且您知道您的应用程序不支持某些内容。因此,在这种情况下,您将设置 13,并且只有 Honeycomb 用户(及更低)才能使用它。由于 15 是可用的最高版本,因此设置它还为时过早……据您所知,16 可能与其他所有应用程序一样能够处理您的应用程序! :)

[编辑]

你甚至不需要 AsyncTask (虽然那将是更 Android 的方式来做到这一点)。 现在只需使用常规线程...

 Handler h = new Handler();
 private Runnable stuffToDoAfterPost = new Runnable(){
       public void run(){
            //whatever you wish to happen after you have done your server call
       }
 };

private class CallServer extends Thread{
   public void run(){
      //make your server call here...


      //then...
      h.post(stuffToDoAfterPost);
   }
}

new CallServer().start(); 

【讨论】:

  • 那为什么我的项目从 sdk 7 运行到 10。即使我将目标设置为 15 并取消 maxSdkVersion 也会出现相同的错误
  • 如果我的猜测是正确的
  • 我在 android avd 4.0.3、android 3.2 上测试过,因为我得到的 avd 是平板电脑。
  • 我建立了一个 ConnectionClass 我无法理解我在哪里实现 AsyncTask
【解决方案2】:

要解决 StrictMode 问题,您需要在活动中使用以下代码 -

static{
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
    StrictMode.setThreadPolicy(policy);  
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2020-03-16
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2012-07-02
    相关资源
    最近更新 更多