【问题标题】:runOnUiThread not updating listviewrunOnUiThread 不更新列表视图
【发布时间】:2016-06-30 12:43:04
【问题描述】:

我认为我查看了几乎所有线程似乎都不起作用。 我有一个聊天,我试图在另一个线程上每秒更新一次列表视图,但是我使用runOnUiThread 虽然它仍然不会更新我记录返回,而且似乎每秒都有一个返回正确数据。 代码

protected void onCreate(Bundle savedInstanceState) {
    ........

    lv = (ListView) findViewById(R.id.message_array);

    returnFunc = "messages";

    messages();
    send = (ImageButton) findViewById(R.id.sendMessage);

    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            returnFunc = "btnSend";
            message = (EditText) findViewById(R.id.messageEditText);
            message_input = message.getText().toString();
            sendMessage();
        }
    });
    new Thread(new Runnable() {
        @Override
        public void run() {
            boolean test = true;

            while (test) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                }
                messages();

            }



        }
    }).start();


}



 public static Handler handler = new Handler();
public void messageLoop(){
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    messages();
                    handler.postDelayed(this,1000);

                }
            });
        }
    },1000);
}

获取数据的消息函数

public void messages() {
    String urlParameters = String.format("%s", "chatid="+tempVars.chatID+"&token="+tempVars.token);
    new AsyncHttpPost(this).execute("http://mylink.com/appAccess.php?action=messages&", urlParameters);

}



public void getMessages(String content){
    myList = new ArrayList<Messages>();

    int index = lv.getFirstVisiblePosition();
    View v = lv.getChildAt(0);
    int top = (v == null) ? 0 : (v.getTop() - lv.getPaddingTop());


    try{
        JSONArray jsonarray = new JSONArray(content);
        for (int i = 0; i < jsonarray.length(); i++) {
            JSONObject jsonobject = jsonarray.getJSONObject(i);
            boolean mine;
            if(jsonobject.getString("isMine").equals("true")){
                mine = true;
            }else{
                mine = false;
            }

            myList.add(new Messages(jsonobject.getString("message"),jsonobject.getString("timestamp"),jsonobject.getString("name"),mine,jsonobject.getString("id")));
        }

    }catch (Throwable tx){

    }

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3)
        {
            Messages CurrentMessage = myList.get(position);
            tempVars.messageID = CurrentMessage.getID();
            //startActivity(new Intent("PersonalChat"));
        }
    });

    if(arrayAdapter == null){
        arrayAdapter = new CustomAdapter(this, myList);
    }
    lv = (ListView) findViewById(R.id.message_array);
    lv.setAdapter(arrayAdapter);

    arrayAdapter.notifyDataSetChanged();

    if(firstView == 0){
        firstView = 1;
        lv.setSelection(arrayAdapter.getCount() - 1);
    }else{
        lv.setSelectionFromTop(index, top);
    }

}

自定义适配器类

   public class CustomAdapter extends ArrayAdapter<Messages>{
    Messages currentMessage;
    public CustomAdapter(Context context,  ArrayList<Messages> messages){
        super(context,R.layout.received_message, messages);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View itemView = convertView;

        currentMessage = myList.get(position);
        setTitle(currentMessage.getName());


        if(currentMessage.isMine()){
            itemView = getLayoutInflater().inflate(R.layout.sent_message,parent, false);

            TextView message = (TextView) itemView.findViewById(R.id.message);
            message.setText(currentMessage.getMessage());

            TextView timestamp = (TextView) itemView.findViewById(R.id.date);
            timestamp.setText(currentMessage.getTimestamp());
        }else{
            itemView = getLayoutInflater().inflate(R.layout.received_message,parent, false);

            TextView message = (TextView) itemView.findViewById(R.id.message_text);
            message.setText(currentMessage.getMessage());

            TextView timestamp = (TextView) itemView.findViewById(R.id.timestamp);
            timestamp.setText(currentMessage.getTimestamp());
        }

        return itemView;
    }
}

提前致谢

更多信息

当我最初在 onCreate 中调用消息函数时,它工作正常

【问题讨论】:

  • 只初始化一次CustomAdapter,只有在列表中添加或删除任何项目时才通知它。
  • 驱动它的权利,你也在你的 lv 中添加一个空适配器
  • @Drv 谢谢,现在会尝试更新你
  • @LucasPaolillo 哦,但是适配器设置好了?
  • @Drv 好像没有变化?

标签: java android multithreading android-runonuithread


【解决方案1】:
 new Thread(new Runnable() {
        @Override
        public void run() {
            boolean test = true;

             while (test) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                }mymessage();

            }



        }
    }).start();

【讨论】:

  • 这不是每秒都返回数据
  • 现在大病测试
【解决方案2】:

用下面的代码替换你的 getMessages() 方法:

public void getMessages(String content){
myList = new ArrayList<Messages>();

int index = lv.getFirstVisiblePosition();
View v = lv.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - lv.getPaddingTop());


try{
    JSONArray jsonarray = new JSONArray(content);
    for (int i = 0; i < jsonarray.length(); i++) {
        JSONObject jsonobject = jsonarray.getJSONObject(i);
        boolean mine;
        if(jsonobject.getString("isMine").equals("true")){
            mine = true;
        }else{
            mine = false;
        }

        myList.add(new Messages(jsonobject.getString("message"),jsonobject.getString("timestamp"),jsonobject.getString("name"),mine,jsonobject.getString("id")));
    }

    arrayAdapter.notifyDataSetChanged();

}catch (Throwable tx){

}

lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3)
    {
        Messages CurrentMessage = myList.get(position);
        tempVars.messageID = CurrentMessage.getID();
        //startActivity(new Intent("PersonalChat"));
    }
});

if(arrayAdapter == null){
    arrayAdapter = new CustomAdapter(this, myList);
}
lv = (ListView) findViewById(R.id.message_array);
lv.setAdapter(arrayAdapter);


if(firstView == 0){
    firstView = 1;
    lv.setSelection(arrayAdapter.getCount() - 1);
}else{
    lv.setSelectionFromTop(index, top);
}

}

【讨论】:

  • 你有什么可以直接联系你的吗
  • 然而最终的 Handler handler = new Handler() handler.postDelayed( new Runnable() { @Override public void run() { chas(); handler.postDelayed( this, 1000 ); } }, 1000);适用于我获取最近的聊天它更新 lv 罚款其基本相同的代码
猜你喜欢
  • 2017-05-21
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2015-06-10
相关资源
最近更新 更多