2016-06-30 13 views
-2

Ich glaube, ich sah fast alle Threads nicht scheinen zu arbeiten. Ive bekam einen Chat und ich versuche, die Listenansicht jede Sekunde im tu es auf einem anderen Thread jedoch im im runOnUiThread zu aktualisieren, obwohl es immer noch nicht aktualisiert im Logging die Rückkehr und es scheint, gibt es eine Rückkehr jede Sekunde mit den richtigen Daten. Der CoderunOnUiThread nicht aktualisierend 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); 
} 

die Funktion Meldungen, die die Daten Fein

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

} 

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

Vielen Dank im Voraus

Mehr Infos

bekommt

Wenn ich die Nachricht Funktion ursprünglich in onCreate nenne es funktioniert gut

+0

nur einmal CustomAdapter initialisieren und es nur benachrichtigen, wenn ein Artikel wird hinzugefügt oder aus der Liste entfernt. – Drv

+0

Drv ist richtig, und Sie fügen auch einen leeren Adapter in Ihrem lv –

+0

@Drv danke versuchen jetzt und aktualisieren Sie –

Antwort

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

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

      } 



     } 
    }).start(); 
+0

dies keine Daten zurückkehr jede Sekunde –

+0

ich meine Antwort Check bearbeitet haben wieder kann es Ihnen –

+0

große krank Test jetzt –

0

Ihren getMessages Replace() -Methode mit folgendem Code:

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

Dank aber Nö kein Update auf Bildschirm –

+0

tun, was u haben, kann ich Ihnen direkt –

+0

jedoch final Handler = new Handler Handler Kontakt auf() handler.postDelayed (neu Runnable() { @Override public void run() { Chas(); Handler.postDelayed (dies, 1000); } }, 1000); funktioniert auf meiner neuesten Chats erhalten es aktualisiert lv fein seine im Grunde den gleichen Code –