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,你会得到 Application Not Responding 错误。

相反,每当您有一些新数据时,请收集数据doInBackground()然后调用updateProgress(). doInBackground()这将导致AsyncTask.onProgress()来自 UI 线程的调用。用onProgress()新数据做任何你需要的事情。

于 2012-05-01T20:31:29.783 回答