2016-06-11 1 views
0

J'essaye de créer une activité de causerie, qui fonctionne avec la base de données Azure SQL. La logique est que tous les messages sont listés sur un listView, un service d'instance vérifiera s'il y a une nouvelle table de données dans la base de données, si c'est le cas, efface ChatAdapter et ajoute toutes les données, puis setAdapter to listView à nouveau. Quand j'ouvre l'activité, ça marche, je peux envoyer des messages, ça va directement sur la base de données et ça arrive à l'écran mais l'activité fonctionne lentement, spikey et parfois gèle pendant une demi-seconde. Peut-être que si je fais la vérification de base de données dans intentservice, cela peut résoudre le problème mais je ne veux rien faire sans conseils. Je ne suis pas vraiment amateur, donc mon code me semble être un gâchis. Aussi je "dois" résoudre ce problème avec cette logique. Donc, vous avez besoin de conseils comme "ne faites pas cette tâche ici, faites-le, n'utilisez pas InstanceService, utilisez AsyncTask ..." au lieu de "Utiliser les services de chat, les services mobiles, ne le faites pas avec la base de données .... », etc.Mon activité android est en train de geler et de travailler lentement. Je dois le rendre stable

Il est mon listView rafraichir le code:

public static boolean refreshList() 
    { 
    if(chatArrayAdapter!=null) { 

     chatArrayAdapter.Reset(); 
     chatArrayAdapter.notifyDataSetChanged();  
     listView.deferNotifyDataSetChanged(); 
     chatArrayAdapter.notifyDataSetChanged(); 
     Mes = null; 
    } 

    try { 


     SqlCon.httpIslemleri(); /** AsyncTask to connect Db**/ 
     Connection con = SqlCon.returnCon(); /** Returns DB Connection **/ 
     Statement getMes = con.createStatement(); 
     SetUser User = Intro.stUser; 
     Mes = null; 

     Mes = getMes.executeQuery("select * from tb_ms where (ms_sender = "+User.getid()+" or ms_sender = "+value+") and (ms_getter = "+User.getid()+" or ms_getter = "+value+")"); 
     while(Mes.next()) 
     { 
      if(Mes.getInt("ms_sender")==User.getid()) 
      { 
       side=false; 
      } 
      else if(Mes.getInt("ms_getter")==User.getid()) 
      { 
       side=true; 
      } 
      chatArrayAdapter.add(new ChatMessage(side, Mes.getString("ms_mes"))); 
      con.close(); 

     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return true; 

} 

fonction CheckMesChanges. Qui vérifie si le tableau a changé Messages:

public static boolean CheckMesChanges(ResultSet Mes) 
{ 
    SqlCon.httpIslemleri(); 
    Connection con = SqlCon.returnCon(); 
    Statement getMes = null; 
    try { 
     getMes = con.createStatement(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    SetUser User = Intro.stUser; 


    try { 
     MesCheck = getMes.executeQuery("select * from tb_ms where (ms_sender = "+User.getid()+" or ms_sender = "+value+") and (ms_getter = "+User.getid()+" or ms_getter = "+value+")"); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    if(MesCheck==Mes) 
    { 
     try { 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 
    else 
    { 
     try { 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 

et mon service intention qui contrôle CheckMesChanges et appelle refreshList si elle retourne vrai:

public class IntentMesControl extends IntentService { 

public IntentMesControl(String name) { 
    super(name); 
} 
final Handler handler = new Handler(); 


protected void onHandleIntent() { 

    if(ChatBubbleActivity.CheckMesChanges(ChatBubbleActivity.Mes)==true) 
    { 
     ChatBubbleActivity.refreshList(); 

    } 
    else { 
    } 

    handler.postDelayed(new Runnable() { 

     public void run() { 

      onHandleIntent(); 

     } 
    }, 500); 
} 

@Override 
protected void onHandleIntent(final Intent intent) { 

    if(ChatBubbleActivity.CheckMesChanges(ChatBubbleActivity.Mes)==true) 
    { 
     ChatBubbleActivity.refreshList(); 
    } 
    else { 
    } 

    handler.postDelayed(new Runnable() { 

     public void run() { 

      onHandleIntent(); 

     } 
    }, 500); 

} 
} 

Je commence à IntentMesControl onCreate d'activité. Alors pouvez-vous m'aider, donnez moi quelques conseils pour rendre mon activité plus stable et rapide? Je vous remercie.

+0

Ce n'est pas une bonne pratique d'appeler directement une méthode comme 'Activity.myMethod()' – Ozgur

Répondre

0

solution juste pour les autres qui peuvent rencontrer avec même problème:

Chaque AsyncTask qui se connecte à votre base de données prendra un peu de temps pour établir une connexion. De même, tous les services utilisant des fonctions d'activité prennent un peu de temps. Ainsi, lorsque vous appelez cet asynctask trop de fois, il gèle votre activité.

Solution est que, si vous voulez créer une connexion SQL, vérifier les données et actualisez listviews vous devez créer:

  • Un IntentService qui se connecte à la base de données, d'obtenir des données et vérifier et retours données si les données sont modifiées.

  • Une fonction qui ne se connecte pas à votre base de données mais qui obtient des données et actualise votre liste.

donc de cette façon, votre chèque de connexion et les données travailleront sur fond et lorsque les données ont changé, AsyncTask appellera fonction pour actualiser la liste.

Il a résolu mon problème. Les nouveaux codes sont comme ça si quelqu'un veut utiliser.

Fonction pour rafraîchir listView:

public static boolean refreshList2(ResultSet Mes2) 
{ 
    if(chatArrayAdapter!=null) { 

     chatArrayAdapter.Reset(); 
     chatArrayAdapter.notifyDataSetChanged(); 
     /*listView.setAdapter(null);*/ 
     listView.deferNotifyDataSetChanged(); 
     chatArrayAdapter.notifyDataSetChanged(); 

    } 
    SetUser User = Intro.stUser; 

    try{ 
     while(Mes2.next()) 
     { 
      if(Mes2.getInt("ms_sender")==User.getid()) 
      { 
       side=true; 
      } 
      else if(Mes2.getInt("ms_getter")==User.getid()) 
      { 
       side=false; 
      } 
      chatArrayAdapter.add(new ChatMessage(side, Mes2.getString("ms_mes"))); 




     } 
     Mes3 = Mes2; 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 


    return true; 

} 
} 

service intention de se connecter DB et vérifier les données est-il a changé:

public class IntentMesServicev2 extends IntentService { 

public IntentMesServicev2(String name) { 
    super(name); 
} 

final Handler handler = new Handler(); 
Connection con; 


ResultSet Mes; 
SetUser User = Intro.stUser; 
int value = ChatBubbleActivity.value; 
public void onCreate(){ 
    httpIslemleri(); 
} 


protected void onHandleIntent() { 

    httpIslemleri(); 


    try { 


     Statement state = con.createStatement(); 

     Mes = state.executeQuery("select * from tb_mes where (ms_sender = " + User.getid() + " or ms_sender = " + value + ") and (ms_getter = " + User.getid() + " or ms_getter = " + value + ")"); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    if (Mes != ChatBubbleActivity.Mes3) { 
     ChatBubbleActivity.refreshList2(Mes); 

    } else { 
    } 


    handler.postDelayed(new Runnable() { 


     public void run() { 


      onHandleIntent(); 


     } 
    }, 500); 
} 

@Override 
protected void onHandleIntent(final Intent intent) { 
    httpIslemleri(); 

    handler.postDelayed(new Runnable() { 


     public void run() { 


      onHandleIntent(); 


     } 
    }, 500); 

} 

public void httpIslemleri() { 

    try { 
     Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
     try { 
      this.con = DriverManager.getConnection("Your DB String"); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

} 
} 

Ce n'est pas Freezin maintenant, mais encore ce code est un gâchis et avec un peu toucher, ça peut mieux fonctionner. Bon codage !!

+1

En ce qui concerne le code étant un gâchis. Vous pouvez regarder [cet article] (http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/) –

+0

Merci. Je vais vérifier cela avec une attention particulière. – ReadyFreddy