我有一个自定义适配器,它与我ListView
类中的MainActivity
相关联,当我按下列表中的一个项目(setOnItemClickListener
方法)时,我执行{ {1}}从数据库中检索信息并将其发送到AsyncTask
。
因此,我必须等到bundle
完成后才能发送AsyncTask
中检索到的信息。
为此,我创建了一个bundle
:
interface
我在另一堂课中有public interface OnCarListener {
void onCarCompleted(String c);
void onCarError(String error);
}
:
AsyncTask
我执行class findCar extends AsyncTask<Integer, Integer, String> {
private final OnCarListener mListener;
public findCar(OnCarListener listener)
{
mListener = listener;
}
protected void onPreExecute() {
}
protected String doInBackground(Integer... idCar) {
String nameCar = "";
//Here the code to retrive the info
nameCar = obj.getString("name");
//Now nameCar = "Car1"
} catch (Exception ex) {
}
return nameCar;
}
protected void onProgressUpdate() {
}
protected void onPostExecute(String c) {
if (mListener != null) {
mListener.onCarCompleted(c);
}
}
}
(在我的AsyncTask
中),如下所示:
MainActivity
执行new findCar(new OnCarListener()
{
@Override
public void onCarCompleted(String c) {
synchronized (c)
{
name = c;
}
}
@Override
public void onCarError(String error) {
}
}).execute(idCar);
之后,我抛弃了捆绑包:
AsyncTask
注意:我使用bundle.putString("name", name);
发送了更多信息,但我省略了它以简化问题。
它应该在我看来工作,但是在bundle
的一个元素的第一次点击中,List
没有传递name
,而第二个传递的是{strong>以及我在bundle
的相同或其余元素中创建的其余点击,它可以正常工作。
预期结果: List
将被执行,直到完成其余代码不起作用。很明显,这不是它现在正在做的事情。
我想知道的是什么:为什么AsyncTask
在第一次迭代中不起作用?我的意思是,当我有synchronized
时,我点击其中一个元素List
显示的元素信息(在另一个活动中),但值List
未显示
如果我返回并且我对name
中的同一元素(或不同的元素)进行了一次或多次点击,则所有元素都会正确显示值List
。
为什么在第一次迭代中它不起作用?
我还有另一个问题:为什么我退出name
时synchronized
在他的回答中说,我点击adelphus
值List
的元素的任何时候{1}}出现?
我在这个问题中尝试了解决方案:synchronized not synchronizing但仍然无效。
我该怎么办? (不改变程序的逻辑)
提前致谢!
答案 0 :(得分:1)
我不确定你理解synchronized
的作用 - 它会在给定对象上创建一个独占锁,以创建对某段代码的有序访问。当多个线程尝试进入同步块(具有相同的锁对象)时,一次只允许一个线程继续进入块。
在您的代码中,您要对String参数c
进行同步。由于没有其他线程会访问此参数,synchronized
在此处无效。
由于您在UI线程上调用了接口回调(通过onPostExecute()
),因此您只需在回调中设置bundle值:
void amethod() {
final Bundle bundle = new Bundle();
new findCar(new OnCarListener()
{
@Override
public void onCarCompleted(String c) {
bundle.putString("name", c);
}
@Override
public void onCarError(String error) {
}
}).execute(idCar);
}