2

我有一个看起来像这样的方法:

public void doSomething(final int num1, final int num2, final String str) {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            reallyComplexStatisticFunction(num1 + num2, str);
        }
    }.execute();
}

(我已经大大简化了这个例子。)

直接使用'方法中提供doSomething()的参数是否明智?或者这会导致线程相关的问题吗?AsyncTaskdoInBackground()

另外,如果第三个参数是一个Context实例而不是一个,它会有什么不同String吗?

4

2 回答 2

2

有一些保证,AsyncTask你可以在它的文档中看到,但这些主要是关于访问AsyncTask的字段。

在您的示例中,您使用的是原语和字符串。两者都不能真正被修改,所以你在这方面是安全的。

但是,如果您正在使用可以从另一个线程修改的对象,那么您不能确定在您调用的那一刻execute()和您实际使用该对象之间它不会被修改,它不会被修改当你在里面读到它时就改变了doInBackground(),或者更糟糕的是,当你试图在里面修改它时它会被修改,doInBackground()并可能以损坏的状态结束。对于这些情况,您需要使用同步来确保一次只有一个线程可以读取或修改此类对象。

如果您需要保持对象的值/状态在execute()您使用它时调用时的状态,doInBackground()您可能希望克隆它并将此克隆用作快照。

于 2013-03-22T23:18:43.173 回答
0

这是安全的,只要您只传递原语和/或对不可变对象的引用。否则,您需要确保没有其他线程将修改这些对象的状态(或同步对它的访问)。

由于Strings 在 Java 中是不可变的,因此您的示例看起来不错。

于 2013-03-22T23:11:53.900 回答