【问题标题】:Object not locked by thread before wait in Android app on Non Activity [duplicate]在非活动的Android应用程序中等待之前,对象未被线程锁定[重复]
【发布时间】:2017-11-19 11:15:55
【问题描述】:

我正在从Non-Activity 类调用CreateOne 方法,而CreateOne 方法需要在Task 执行后返回Object。所以我在调用任务后添加了以下行。

task.wait();

但它会返回类似的错误

object not locked by thread before wait()

这是我的完整代码:

public class MyStitchHelper
{
    public Object CreateOne(Map<String, Object> map) throws InterruptedException
    {
        Object returnObject = null;
        Document mapDoc = new Document(map);
        ArrayList<Document> list = new ArrayList<>();

        list.add(mapDoc);

        Document itemsDocument = new Document("items", list);
        PipelineStage itemsStage = new PipelineStage("literal", "", itemsDocument);
        Document AuthDocument = new Document();
        AuthDocument.append("database","my_db");
        AuthDocument.append("collection", _collectionName);
        PipelineStage AuthStage = new PipelineStage("insert", "mongodb-atlas", AuthDocument);


        Task<List<Object>> task = _client.executePipeline(itemsStage, AuthStage);

        task.wait();

        if(task.isSuccessful())
        {
            Log.e("UserDAL", task.getResult().toString());
            returnObject = task.getResult();
        }
        else
        {
            Log.e("UserDAL", "Error Adding Collectionsss");
            task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e("UserDAL", "" + e.getMessage());
            }
            });
        }

        return returnObject;
    }
}

调用方法:

public void AddUser()
{
    MyStitchHelper DBHelper = new MyStitchHelper();

    Map<String, Object> map = new HashMap<>();

        map.put(User.Columns.EMAIL,user.get_userName());
        map.put(User.Columns.PASSWORD, user.get_password());
        map.put(User.BaseColumns.CREATED_DATE, Calendar.getInstance().getTime());

        Document doc = (Document) DBHelper.CreateOne(map);
}

首先,我正在尝试做的实现是否正确只是创建一个新用户并在创建后返回文档对象。

为什么会抛出错误?

有什么想法吗?

【问题讨论】:

    标签: java android multithreading task mongodb-stitch


    【解决方案1】:

    这里是Question,关于类似的问题。可能有用

    简而言之,最佳答案:

    引用:“以下是等待和通知的使用方式:”

    private Queue<Product> q = ...;
    private Object lock = new Object();
    
    void produceSomething(...) {
        Product p = reallyProduceSomething();
        synchronized(lock) {
            q.add(p);
            lock.notify();
        }
    }
    
    void consumeSomething(...) {
        Product p = null;
        synchronized(lock) {
            while (q.peek() == null) {
                lock.wait();
            }
            p = q.remove();
        }
        reallyConsume(p);
    }
    

    【讨论】:

    • 谢谢,但是这个例子看到两个方法都在同一个类中,并且正在使用锁定对象,在我的例子中,它们都来自不同的类。
    • 什么是Queue&lt;Product&gt; q = ...;
    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2018-11-30
    • 2014-12-22
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多