同步不同步

时间:2015-08-20 18:34:04

标签: java android android-asynctask synchronized

我有一个自定义适配器,它与我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

为什么在第一次迭代中它不起作用?

我还有另一个问题:为什么我退出namesynchronized在他的回答中说,我点击adelphusList的元素的任何时候{1}}出现?

我在这个问题中尝试了解决方案:synchronized not synchronizing但仍然无效。

我该怎么办? (不改变程序的逻辑)

提前致谢!

1 个答案:

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