是否在此代码中使用了同步?

时间:2012-05-01 18:03:00

标签: android android-asynctask synchronized

我想知道我是否正确理解如何使用同步我会写下一些伪代码,它会模仿我想要做的事情。

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等待锁定,直到通知继续并显示。 这是正确的吗?这是通常的方式吗?

1 个答案:

答案 0 :(得分:0)

不,这样你可以阻止onCreate中的UI线程,你将得到Application Not Responding错误。

相反,只要您有新数据,请在doInBackground()中收集数据,然后在updateProgress()中调用doInBackground()。这将导致来自UI线程的AsyncTask.onProgress()调用。在onProgress()中,根据新数据执行您需要的任何操作。