【问题标题】:How to make threads synchronize in a loop statement?如何使线程在循环语句中同步?
【发布时间】:2011-08-17 02:07:26
【问题描述】:

我是线程新手。我正在尝试加载一小部分照片。现在我正在使用异步任务/线程,但是如何使结果连续?下图为:

我想要什么:

a[0] = photo1;
a[1] = photo2;
a[2] = photo3;
a[3] = photo4

我的程序给了我什么。请注意,顺序会发生变化并且是随机的:

a[0] = photo[2];
a[1] = photo[1];
a[2] = etc

这是我的代码的 sn-p:

...
for (int i = 0; i < mNoOfContacts; i++) {
    String stringContactUri = storeSettings.getString("contactUri"+i, "");
    if (stringContactUri != ""){
        Uri contactUri = Uri.parse(stringContactUri);
        loadContactInfo(contactUri);
    }
...
private void loadContactInfo(Uri contactUri) {

    AsyncTask<Uri, Void, ContactInfo> task = new AsyncTask<Uri, Void, ContactInfo>() {

        @Override
        protected ContactInfo doInBackground(Uri... uris) {             
            return mContactAccessor.loadContact(getContentResolver(), uris[0]);
        }

        @Override
        protected void onPostExecute(ContactInfo result) {
            Contacts[mNoOfContacts] = result;
        Toast.makeText(getApplicationContext(), mNoOfContacts+"Picked Contact"+Contacts[mNoOfContacts].getDisplayName(), Toast.LENGTH_SHORT).show();
            mNoOfContacts++;
        } 
    };

    task.execute(contactUri);
}
...

我的代码是对 Google Android 演示应用 - 名片的修改。 请帮忙!谢谢!

【问题讨论】:

    标签: android multithreading asynchronous android-asynctask


    【解决方案1】:

    最简单的方法可能是让onPostExecute 方法调用一个执行排序的例程:传递ContactInfo 和Uri,然后将Uri 与原始Uri 进行比较,并将其放在适当的位置。

    或者修改你的AsyncTask,这样你就可以一次通过所有Uris,而不是每个Uri启动一个,然后从那里开始。

    【讨论】:

      【解决方案2】:

      我认为,根据定义,“异步任务”是不同步的……异步字面意思是“不同步”。如果您希望它同步,只需通过执行 URI 调用以老式方式加载它们,获取您的照片并在加载最后一张照片后再次执行此操作。

      【讨论】:

        猜你喜欢
        • 2011-06-24
        • 2016-11-13
        • 2014-07-04
        • 1970-01-01
        • 2011-05-31
        • 2018-11-03
        • 2020-01-02
        • 2017-03-23
        • 2013-01-01
        相关资源
        最近更新 更多