-2

我认为我查看了几乎所有线程似乎都不起作用。我有一个聊天,我试图每秒更新列表视图,我在另一个线程上执行它但是,我使用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 中调用消息函数时,它工作正常

4

2 回答 2

0
 new Thread(new Runnable() {
        @Override
        public void run() {
            boolean test = true;

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

            }



        }
    }).start();
于 2016-06-30T12:47:16.387 回答
0

用以下代码替换您的 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);
}

}
于 2016-06-30T15:50:28.013 回答