34

アプリケーションのデバッグについて助けが必要です。まず第一に、エミュレーターやその他のデバイスでは、アプリは正常に動作しています。私のデバイスでは、(強制終了メッセージなしで)強制終了しました。

アプリのアクティビティが変更されると、「クラッシュ」が発生します。

MainActivityこれがクラスのコードです。WebView を介して Web ページから HTML コンテンツを読み取るだけです。いいえ、HttpRequest投稿リクエストをシミュレートできなかったため、これをやり直すことはできません。

public class MainActivity extends Activity {

    public final static String EXTRA_HTML = "com.example.com.test.HTML";

    private WebView mWebView;
    private ProgressDialog mDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  
        mWebView = (WebView) findViewById(R.id.webView1);
        CookieSyncManager.createInstance(this);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
        mWebView.setBackgroundColor(0);
        mWebView.setWebChromeClient(new WebChromeClient() {
            public boolean onConsoleMessage(ConsoleMessage cmsg) {
                if (cmsg.message().startsWith("MAGIC")) {
                    mDialog.cancel();
                    /*HashMap<String, String> message = new HashMap<String, String>();*/
                    String msg = cmsg.message().substring(5);
                    Intent intent = new Intent(MainActivity.this,
                        ReadDataActivity.class);
                    /*message.put("message", msg);*/
                    /*intent.putExtra(EXTRA_HTML, message);*/
                                    intent.putExtra(EXTRA_HTML, msg);
                    startActivity(intent);
                }
                return false;
            }
        });
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setPluginState(PluginState.OFF);
        mWebView.getSettings().setLoadsImagesAutomatically(false);
        mWebView.getSettings().setBlockNetworkImage(true);
        mWebView.getSettings().setAppCacheEnabled(true);
        mWebView.getSettings().setSavePassword(true);
        mWebView.getSettings()
                .setCacheMode(WebSettings.LOAD_NORMAL);
        mWebView.setWebViewClient(new WebViewClient() {

            public void onPageFinished(WebView view, String address) {
                if (address.indexOf("mySession") != -1) {
                    view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");
                }
});

                mWebView.loadUrl("http://www.myurl.de");

}

そのため、このonConsoleMessage()メソッドでは、html コードを別の Activity クラスに渡し、コンテンツを読み取り、解析して表示します。

問題は、この時点でReadDataActivityクラスをロードする必要があるときに、アプリケーションを閉じて、メッセージやユーザー ダイアログなしでホーム画面に戻ることです。

に文字列として渡される html コードがReadDataActivity大きすぎる可能性はありますか? また、HashMap に html コードを文字列として追加しようとしましたが、問題は同じです。

問題をデバッグするために私ができることは何ですか? Parcelableたぶん私はオブジェクトを作成しようとするべきですか?

エミュレーターでは、すべて正常に動作しています。

4

9 に答える 9

64

私の経験 (少し前) によると、IPCでは最大1MBのデータを分割できます。Bundle特定の時間に多数のトランザクションが発生している場合は、この制限を減らすことができます。詳細はこちら

この問題を解決するには、コンテンツを一時ファイルに保存し、一時ファイルのパス/URIを 2 番目のアクティビティに渡すことをお勧めします。次に、2 番目のアクティビティで、ファイルから内容を読み取り、目的の操作を実行して、最後にそのファイルを削除します。

必要に応じて、このタスクにShared_Preferencesを組み込むこともできます (ファイルの処理が面倒だと思われる場合)。

于 2012-09-19T14:40:34.870 に答える
20

インテントを使用して転送できるデータの最大量について調査しました。そして、制限は 1MB や 90KB に近くなく、 500KBに近いようです(API 10、16、19、および 23 でテスト済み)。

このトピックに関するブログ記事を書きました。ここで見つけることができます: http://web.archive.org/web/20200217153215/http://neotechsoftware.com/blog/android-intent-size-limit

于 2016-05-05T15:48:10.393 に答える
4

Jelly Beanの Intent のサイズ制限は依然としてかなり低く、1MB よりやや低い (約 90K) ため、アプリケーションが最新の Android バージョンのみを対象としている場合でも、データの長さには常に注意する必要があります。

于 2013-09-01T02:49:09.693 に答える
2

Binder トランザクション バッファの固定サイズは 1Mb に制限されています。しかし、問題は、プロセスで進行中のすべてのトランザクションによってバッファが共有されることです。

そのため、インテントのデータを毎回できるだけ小さく保つようにしてください。

于 2016-10-03T15:44:14.800 に答える
2

ゲームに少し遅れましたが、同じ問題に遭遇しました。私の場合、データをファイルに書き込むことはパフォーマンス的に意味がありませんでしたが、答えを探しているときにこれに出くわしました:

http://developer.android.com/guide/faq/framework.html#3

ディスク IO が不要なため、シングルトンを使用する方が適しています。データを永続化する必要がない場合は、パフォーマンスが向上します。

実装例を次に示します。

public class DataResult {

    private static DataResult instance;
    private List<SomeObject> data = null;

    protected DataResult() {

    }

    public static DataResult getInstance() { 
        if (instance == null) {
            instance = new DataResult();
        }
        return instance;
    }

    public List<SomeObject> getData() { return data; }
    public void setData(List<SomeObject> data) { this.data = data; }
}

次に、これを 1 つのアクティビティで使用して設定できます。

DataResult.getInstance().setData(data);

そして、次のような他のアクティビティでそれを取得します:

List<SomeObject> data = DataResult.getInstance().getData();
于 2014-12-20T21:03:38.067 に答える
1

アクティビティ間で大きなデータを渡すための代替ソリューションは、静的フィールドを使用することです。あなたの場合、この行を ReadDataActivity クラスに追加します

public static String msg;

次に、次のように MainActivity クラス内で静的フィールド msg を使用できます。

ReadDataActivity.msg = cmsg.message().substring(5); 

そして最後に、余分なプットなしでアクティビティを開始します

Intent intent = new Intent(MainActivity.this, ReadDataActivity.class);                  
startActivity(intent);
于 2016-07-25T09:00:22.510 に答える