0

わかりました、私はしばらくの間 Android アプリケーションに取り組んできました。基本的には RSS レシーバーです。RSS を使って、ニュース、天気予報、テレビのスケジュール、ホロスコープをチェックしています。

Android 2.3.3、2.3.6、さらには 2.1 でテストしている間は、すべて問題ありませんでした。しかし、Android 4.0 を使用している友人に送信したところ、動作しませんでした。怪しいのでエミュレーターで試してみました。4.0 エミュレーターでも 4.1 エミュレーターでも実行できません。ここでは、マニフェストと 1 つのクラスを提供します。誰かがこれを修正する方法を知っていれば、それは素晴らしいことです.

<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>

そして、ここに1つのクラスがあります:

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 スレッドで実行されることです。
そのため、アクティビティでネットワーク呼び出しを行うと、応答 (またはタイムアウト) が得られるまで UI 全体がフリーズします。これは絶対に避けたいことです。この問題の簡単な解決策は、 AsyncTaskを使用することです。セカンダリ スレッドで操作を行うための組み込みソリューションを簡単に実装できます。

于 2012-10-18T08:31:30.957 に答える