0

私はアンドロイドアプリを作っています。アプリにはアクティビティがあり、トリガーされると、sparsearray を作成してデータを入力します。現在、このプロセスはエミュレーターで最大 1 分かかり、非常に時間がかかります。そのため、アプリの起動時にその sparsearray を一度作成し、アプリの存続期間中は sparsearray を RAM に保存したいと考えています。また、アクティビティがトリガーされるたびに、新しいものを作成するのではなく、RAM 内の sparsearray にアクセスする必要があるため、時間と処理能力が節約されます。これを行うことができますか?この質問がばかげている場合は申し訳ありませんが、私はアンドロイドが初めてです。ありがとう!*編集: これは sparsearray を作成する関数がどのように見えるかです: //sparsearray を作成する関数にアクセスする関数

public String[] process(){
InputStream is = context.getAssets().open("feedtitlesandaddresses.txt");
        InputStreamReader iz=new InputStreamReader(is);
        BufferedReader br = new BufferedReader(iz);
        String line = null;
while((line=br.readLine())!=null) {

            readLine(line);

            }}
//sparsearray making function
private void readLine(String line) {
//some string processing(omitted here)
int num1 = Integer.parseInt(firstNumber);

        //int num2 = Integer.parseInt(secondNumber);
        if(sparseArray.get(num1) == null) {

            sparseArray.put(num1, new SparseArray<String>());

        }
        temporarySparseArray = sparseArray.get(num1);

        for(int w=0;w<size;w++){
        temporarySparseArray.put(w, array1[w]);
                }
        sparseArray.put(num1, temporarySparseArray);

        temporarySparseArray = null;
}
4

2 に答える 2

0

この質問は答えに値すると思います。誰かがそれを思い付くと確信していましたが、うーん、これまでのところ実際にはそうではありません。そして、私がTom Wongだったとしたら、現在、StackOverflowは、専門家になりたい人が質問に答えるのではなく、争い始める場所であるかのように見えます。;)では、ここに行きます。

  • 起動時に何かを実行します。その結果は、アプリがメモリ内にある限り持続します。これを実行する適切な場所はApplication.onCreate()、であり、サブクラス化する必要がありますApplication。この場合も、結果をオブジェクトに保存しても問題ありません。この場合、アプリケーションコンテキストを取得するApplicationことで、どこからでも結果にアクセスできます。Activity

  • 時間がかかることを実行します。一般に、AsyncTaskAndroidで使用することをお勧めしますが、ユーザーインターフェースに関連するものを実行することに特化していますが、それをブロックしてはなりません。また、明示的な調整がない場合、その動作はAndroidのバージョンによって異なります。現在、それ以上の対策がなければ、AsyncTaskを介して計算を行った場合、他のAsyncTasksが最初に待機する必要があります。また、実行したいのはAsyncTaskを使用するための古典的なタスクではないため、結果を最終的にvolatile参照に格納するだけの1回限りのスレッドを使用します。

次のコードスニペットはあなたにアイデアを与えるはずです。

final class MyApplication extends Application {
    public volatile String[] expensiveToCompute;
    @Override
    public void onCreate() {
        expensiveToCreate = null;
        (new Thread() {
            @Override
            public void run() {
                String[] result = computeMyData();
                // it is important to assign the locally created data at once here
                expensiveToCompute = result;
            }
        }).start();
    }
}

このように、非同期計算が終了するまでになりますexpensiveToComputenull

このスレッドは終了するまで実行され、MyApplicationオブジェクトへの参照を保持することを理解することが重要です。つまり、ユーザーがアプリを離れても、それまでスレッドが終了していなければ、スレッドは続行されます。

どちらのAndroidも、可能であるという理由だけでApplicationオブジェクトを存続させることを決定するため、これは実際には素晴らしいことです。その場合、ユーザーエクスペリエンスが向上します。または、Androidは、アプリケーションオブジェクト、スレッド、および保持されているデータを使用してプロセス全体を強制終了します。この場合、次回は最初から開始されます。

高価な計算を移動するための提案などについてもう1つ:Androidはそのようなスレッドにデフォルトのバックグラウンド優先度を割り当て、Androidシステムがアイドル状態であるかどうかに関係なくAsyncTask、すべてのバックグラウンドスレッドは(現在)10%のCPU時間で動作する必要がありますそれ以外の場合。集中的な計算をバックグラウンドタスクに移す非常に多くの人々は、それが10倍長くかかることに気づきます。したがって、これをここおよび/またはここで処理する方法に関する私の提案を読むことをお勧めします。

于 2013-03-20T09:02:14.283 に答える