0

同期の使用方法を正しく理解しているかどうかを知りたいのですが、私がやろうとしていることを模倣する疑似コードを書き留めます。

public MyApp extends Application {

    public Object mLock = new Object();

    private final ArrayList<String> MyList = new ArrayList<String>();

    public ArrayList<String> getMyList(){
        return MyList;
    }
}


private class MyTask extends AsyncTask<String, Void, Void> {
    @Override
    protected Void doInBackground(String... url) {
        final ArrayList<String> BgList = MyApp.getMyList();
        synchronized (mLock) {
            while(somefinishcondition) {
                try {
                    // Get some stuff from the web
                    BgList.add(newstuff);
                    mLock.notifyAll();
                }
                catch (IOException e) {
                }
            }
        }
        return null;
    }
}


public class DisplayActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewer);

        final ArrayList<String> FgList = MyApp.getMyList();

        synchronized (mLock) {
            while(somecondition) {
                mLock.wait();
                if(FgList.size()>lastSize) {
                    n = FgList.size();
                    for(i=lastSize+1; i<=n ; i++){
                        Display(Fglist.get(i));
                    }
                    lastSize = n;
                }
            }
        }
}

これが私がやっていると思うことです: バックグラウンドでデータ収集タスクを実行し、データをグローバルリストに入れています。新しいデータがあるたびに、DisplayActivity に通知します。これにより、前回以降のすべての新しいデータが表示されます。AsyncTask は、新しいデータが到着するまでデータをロックします。DisplayActivity は、続行して表示するように通知されるまでロックで待機します。これは正しいですか?これは通常の方法ですか?

4

1 に答える 1

0

いいえ、この方法では UI スレッドをブロックでき、onCreateアプリケーションが応答しないというエラーが発生します。

代わりに、新しいデータがあるときはいつでも、 でデータを収集してからdoInBackground()を呼び出します。これにより、UI スレッドからの呼び出しが発生します。新しいデータで必要なことは何でもします。updateProgress()doInBackground()AsyncTask.onProgress()onProgress()

于 2012-05-01T20:31:29.783 に答える