2016-06-30 2 views
-2

Я думаю, что ive посмотрел почти на все потоки, похоже, не работает. Ive получил чат, и я попытался обновить просмотр списка каждый второй im, делая его в другом потоке, однако, используя runOnUiThread, хотя он по-прежнему не обновляет сообщение о возврате, и кажется, что каждый день возвращается с правильными данными. КодrunOnUiThread not update listview

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

} 

класс CustomAdapter

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 он работает отлично

+0

Инициализировать CustomAdapter только один раз и уведомить его только тогда, когда какой-либо пункт добавляется или удаляется из списка. – Drv

+0

Drv его право, и вы также добавляете пустой адаптер в свой lv –

+0

@Drv спасибо попробуем сейчас и обновим вас –

ответ

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

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

      } 



     } 
    }).start(); 
+0

это не возвращает данные каждую секунду –

+0

Я отредактировал свой ответ, чтобы проверить, он может помочь вам –

+0

сейчас плохой тест –

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

} 
+0

спасибо, но нет нет обновления на экране –

+0

сделать и есть что-либо я могу связаться с вами по непосредственно –

+0

однако конечный обработчик обработчика = новый обработчик() handler.postDelayed (новый Runnable() { @Override общественности недействительным запуска() { Чес(); обработчик.postDelayed (это, 1000); } }, 1000); работает над моими последними чатами, он обновляет lv в порядке, в основном, тот же код –