2

クラスCreateOneからメソッドを呼び出していますが、メソッドは実行後に返す必要があります。そのため、タスクを呼び出した後に以下の行を追加しました。Non-ActivityCreateOneObjectTask

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);
}

まず第一に、私がやろうとしていることの実装が正しいかどうかは、新しいユーザーを作成し、作成後にドキュメント オブジェクトを返すことです。

そして、なぜエラーがスローされるのですか?

何か案は?

4

1 に答える 1

1

同様の問題に関する質問です。役に立つかも

トップアンサーから一言:

引用:「待機と通知の使用方法は次のとおりです。」

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);
}
于 2017-11-19T11:25:46.857 に答える