2015-08-20 257 views
-1

我有它在我的MainActivity类与ListView相关的,当我按清单(setOnItemClickListener法)的项目之一,我执行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发送的详细信息,但我忽略它简化问题。

应该在我看来,工作,但在Listname的一个元素第一次点击是不是由bundle只是在第二和点击其余我在相同或发过去了,List的其余元素中,它起作用。

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

我想知道的是:为什么​​在第一次迭代中不起作用?我的意思是,当我有List时,我点击List其中一个元素显示的元素信息(在另一个Activity中),但值name未显示。

如果我回去,并且我在List的同一元素(或不同的元素)上做了一次或多次点击,它们全都正确显示值name

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

而且我还有一个问题:为什么如果我退出​​为adelphus他回答说,任何我点击List价值name出现的元素的时代?


我试过这个问题的解决方案:synchronized not synchronizing但仍然无法正常工作。

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

在此先感谢!

回答

1

我不确定你了解​​的作用 - 它创建一个给定对象的排他锁,以创建对一段代码的有序访问。当多个线程尝试进入同步块(使用相同的锁对象)时,一次只允许一个线程继续进入块。

在您的代码中,您正在同步字符串参数c。由于没有其他线程将访问此参数,因此​​在此处不起作用。

由于您的界面回调函数被调用在UI线程(通过onPostExecute()),你可以在回调设置的束值:

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

现在,任何时代的我按在列表中的元素它存储在包中的值“name”。 –

+0

根据你的回答,我尝试同步我的'bundle',因为它似乎试图在它发送的包中插入新的值,但我得到的错误与你的情况相同。任何时间发送的名称。 –

+0

您的问题是要解决在第一个项目被点击时将值放入包** ** - 这就是代码的作用。是的,它也会替换名称,只要你点击一个项目 - 但我不知道你是如何使用你的包,或你在哪里/如何发送它。 – adelphus