Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步不';不同步_Java_Android_Android Asynctask_Synchronized - Fatal编程技术网

Java 同步不';不同步

Java 同步不';不同步,java,android,android-asynctask,synchronized,Java,Android,Android Asynctask,Synchronized,我有一个自定义适配器,它与我的MainActivity类中的ListView相关联,当我按下列表中的一项(setOnItemClickListener方法)时,我执行一个AsyncTask从数据库检索信息并将其发送到捆绑包中 因此,我必须等到AsyncTask完成后才能发送包中检索到的信息 为此,我创建了一个接口: public interface OnCarListener { void onCarCompleted(String c); void onCarError(S

我有一个自定义适配器,它与我的
MainActivity
类中的
ListView
相关联,当我按下列表中的一项(
setOnItemClickListener
方法)时,我执行一个
AsyncTask
从数据库检索信息并将其发送到
捆绑包中

因此,我必须等到
AsyncTask
完成后才能发送
包中检索到的信息

为此,我创建了一个
接口

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
后,我抛出包:

bundle.putString("name", name);
注意:我用
包发送了更多信息,但为了简化问题,我省略了它

在我看来,它应该可以工作,但是在第一次点击
列表的一个元素时,
名称没有被
包传递,就在第二次点击时,我在相同的位置或者在
列表的其余元素中进行的其余点击都可以工作

预期结果:
AsyncTask
将被执行,在它完成之前,代码的其余部分不应工作。很明显,这不是它现在正在做的事情

我想知道的是:为什么同步的
在第一次迭代中不起作用?我的意思是,当我有
列表
时,我点击
列表的一个元素
该元素的信息会显示(在另一个活动中),但值
名称
不会显示

如果我返回并在
列表
中的同一元素(或不同元素)上单击一次或多次,则所有元素中都会正确显示值
name

为什么在第一次迭代中它不工作

我还有另一个问题:如果我退出
synchronized
,就像
adelphus
在他的回答中所说的那样,我点击
列表的任何一个元素
都会出现
name


我尝试了这个问题的解决方案:但仍然不起作用

我能做什么?(不改变程序逻辑)


提前谢谢

我不确定您是否理解
synchronized
的作用-它在给定对象上创建独占锁,以创建对代码段的有序访问。当多个线程试图进入一个同步块(使用相同的锁对象)时,一次只允许一个线程继续进入该块

在代码中,您正在对字符串参数
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);
}

现在,每当我按下列表中的元素时,值
name
就会存储在bundle中。根据您的回答,我试图同步我的
bundle
,因为它似乎试图在发送bundle时插入新值,但我得到的错误与您的情况相同。
名称
被发送的任何时间。您的问题是解决在单击第一项时将值放入捆绑包的问题-这就是此代码的作用。是的,每当您单击某个项目时,它也会替换名称-但我不知道您是如何使用捆绑包的,也不知道您在哪里/如何发送捆绑包。您需要知道什么?我真的被困在这里了。在我的包中,我只传递一些信息和我必须从数据库中检索的
名称。我的问题是,我无法从执行
AsyncTask
AsyncTask
MainActivity
中提取此
name
。谢谢你的时间!
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);
}