Java listView更新不需要';不能使用静态变量

Java listView更新不需要';不能使用静态变量,java,android,listview,runnable,ui-thread,Java,Android,Listview,Runnable,Ui Thread,我有一个带有自定义适配器的ListView。我想更新ListView的数据。为此,我在适配器中编写了以下函数: public void addData(Offer newOffer){ this.offerList.clear(); this.offerList.add(newOffer); this.notifyDataSetChanged(); } 我现在的问题是,当我想在UI线程之外使用以下函数调用此函数时(该函数不位于OfferActivity内部),它不起作用

我有一个带有自定义适配器的ListView。我想更新ListView的数据。为此,我在适配器中编写了以下函数:

public void addData(Offer newOffer){
    this.offerList.clear();
    this.offerList.add(newOffer);
    this.notifyDataSetChanged();
}
我现在的问题是,当我想在UI线程之外使用以下函数调用此函数时(该函数不位于OfferActivity内部),它不起作用:

@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    final String message = new String(body, "UTF-8");

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            OffersActivity.offerAdapter.addData(new Offer("test", message));
        }
    });
}
适配器是OfferActivity中的公共静态变量。有人知道为什么这不起作用吗


Bruno

您不能从原始UI线程以外的任何线程运行
notifyDataSetChanged()
。这样做

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                OffersActivity.offerAdapter.addData(new Offer("test", message));
            }
        });

    }
});

首先,您的方法应该是name
updateData
,而不是
addData
,因为它不添加任何内容,而是用新数据替换旧数据

然后尝试(假设您的
handleDelivery
方法在您的活动中):


看来你比我快^^哈哈,只差几秒钟:)问题是handleDelivery函数在另一个类中…有任何回调可以使用吗?什么是
handleDelivery
函数的一部分?但是您首先需要什么处理程序呢?如果需要在后台处理某些内容并返回结果,为什么不使用AsyncTask呢。在我看来,更容易处理,因为
onPostExecute
直接在UI线程上运行?
new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
             runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                           // NON static variable
                           OffersActivity.this.offerAdapter.addData(new Offer("test", message));
                        }
                    }