0

好的,我已经在 Android 应用程序上工作了一段时间。它基本上是一个 RSS 接收器。我使用 RSS 来查看新闻、天气预报、电视节目表和星座运势。

当我在 Android 2.3.3、2.3.6 甚至 2.1 上测试它时,一切都很好;但是当我将它发送给我的朋友使用 Android 4.0 时,它不起作用。我很怀疑,所以我在模拟器上测试了它。4.0 和 4.1 模拟器都不能运行它。在这里,我提供 Manifest 和一个类。如果有人知道如何解决这个问题,那就太好了。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XXX.XXXXX.XXX"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="14" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".Vodic"
        android:label="@string/title_activity_pocetna" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    <activity
        android:name=".Pomoc"
        android:label="@string/m_tel_vodi_za_odlu_ne"
        ></activity>
    <activity
        android:name=".Pomocna"
        android:label="@string/m_tel_vodi_za_odlu_ne"
        ></activity>
    .
    .
    .

    <activity
        android:name=".TvRasporedTreca"
        android:label="@string/m_tel_vodi_za_odlu_ne"
        ></activity>

</application>

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

<!-- Needed to check when the network connection changes -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

</manifest>

这是一堂课:

public class Vodic extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pocetna);
    Button tv = (Button)findViewById(R.id.tv);
    Button vijesti = (Button)findViewById(R.id.vijesti);
    Button horoskop = (Button)findViewById(R.id.horoskop);
    Button vremenska_prognoza = (Button)findViewById(R.id.vremenska_prognoza);
    Button o_aplikaciji = (Button)findViewById(R.id.o_aplikaciji);
    Button pomoc = (Button)findViewById(R.id.pomoc);

    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            Intent fy=new Intent(getApplicationContext(), TV_Raspored.class);
            startActivity(fy);
        }
    });

    .
    .
    .

    pomoc.setOnClickListener(new View.OnClickListener() {
        @Override
    public void onClick(View arg0) {
            Intent fy=new Intent(getApplicationContext(), Pomoc.class);
            startActivity(fy);
        }
    });

}

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if(netInfo != null && netInfo.isConnected()) {
        return true;
    }
    return false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_pocetna, menu);
    return true;
}
}

所以,总结一下。它适用于 2.1 和 2.3.3 但不适用于 4.0 和 4.1 。我不知道出了什么问题..所以如果有人知道,请帮助..

4

1 回答 1

1

从 Android 3.x 及更高版本开始,Google 添加了一些检查,如果您的应用程序采用非常糟糕的做法,则会产生错误。
没有日志很难确认,但最可能的情况是您在活动的核心进行网络操作,生成 NetworkOnUIThread 异常。
这不是 Android 框架中的错误。问题是您的活动在主线程中运行,即 UI 线程。
因此,当您在 Activity 中进行网络调用时,整个 UI 会冻结,直到您得到答案(或超时);这是您绝对要避免的事情。这个问题的一个简单解决方案是使用AsyncTask:它是一种易于实现的内置解决方案,可以在辅助线程中进行操作。

于 2012-10-18T08:31:30.957 回答