我的 android activity 冻结并且工作缓慢。我需要让它稳定
My android activity is freezing and working slow. I need to make it stable
我正在尝试创建一个与 Azure SQL 数据库一起使用的聊天 activity。逻辑是所有消息都列在一个listView上,实例服务将检查它是否有关于消息table的新数据在数据库中,如果有,它会清除ChatAdapter并添加所有数据,然后setAdapter到listView再次.
当我打开 activity 时,它可以工作,我可以发送消息,它直接进入数据库并出现在屏幕上,但是 activity 工作缓慢,尖锐,有时会冻结半秒钟。也许如果我在 intentservice 中进行数据库检查,它可以解决问题,但我不想在没有建议的情况下做任何事情。
我算不上业余所以我的代码看起来一团糟。我"must"也用这个逻辑解决了这个问题。所以需要像“不要在这里做这个任务,在那里做这个任务。不要使用 InstanceService,使用 AsyncTask ......“而不是”使用聊天服务,移动服务,不要用数据库...... "等
有我的listView刷新代码:
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;
}
CheckMesChanges 函数。检查 Messages Table 是否已更改:
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;
}
我的 Intent Service 控制 CheckMesChanges 并在 returns 为真时调用 refreshList:
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);
}
}
我在 activity 的 onCreate 启动了 IntentMesControl。所以你能帮我,给我一些建议让我的 activity 更 stable 更快吗?谢谢。
解决方案仅供遇到相同问题的其他人使用:
每个连接到数据库的 Asynctask 都需要一些时间来建立连接。此外,任何使用 activity 功能的服务都需要一点时间。因此,当您多次调用此 Asynctask 时,它会冻结您的 activity.
解决方案是,如果你想创建一个SQL连接,检查数据并刷新你需要创建的列表视图:
一个 IntentService,它将连接到数据库,获取数据并检查它,如果数据发生变化,returns 数据。
一个不连接到数据库但获取数据并刷新列表的函数。
因此,通过这种方式,您的连接和数据检查将在后台进行,当数据更改时,asynctask 将调用函数来刷新列表。
它解决了我的问题。新码就是这样,谁要用
刷新列表视图的函数:
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;
}
}
用于连接数据库并检查数据是否已更改的意图服务:
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();
}
}
}
现在不是 freezin,但这段代码仍然是一团糟,稍作修改,它可以更好地工作。写得不错!!
我正在尝试创建一个与 Azure SQL 数据库一起使用的聊天 activity。逻辑是所有消息都列在一个listView上,实例服务将检查它是否有关于消息table的新数据在数据库中,如果有,它会清除ChatAdapter并添加所有数据,然后setAdapter到listView再次.
当我打开 activity 时,它可以工作,我可以发送消息,它直接进入数据库并出现在屏幕上,但是 activity 工作缓慢,尖锐,有时会冻结半秒钟。也许如果我在 intentservice 中进行数据库检查,它可以解决问题,但我不想在没有建议的情况下做任何事情。
我算不上业余所以我的代码看起来一团糟。我"must"也用这个逻辑解决了这个问题。所以需要像“不要在这里做这个任务,在那里做这个任务。不要使用 InstanceService,使用 AsyncTask ......“而不是”使用聊天服务,移动服务,不要用数据库...... "等
有我的listView刷新代码:
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;
}
CheckMesChanges 函数。检查 Messages Table 是否已更改:
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;
}
我的 Intent Service 控制 CheckMesChanges 并在 returns 为真时调用 refreshList:
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);
}
}
我在 activity 的 onCreate 启动了 IntentMesControl。所以你能帮我,给我一些建议让我的 activity 更 stable 更快吗?谢谢。
解决方案仅供遇到相同问题的其他人使用:
每个连接到数据库的 Asynctask 都需要一些时间来建立连接。此外,任何使用 activity 功能的服务都需要一点时间。因此,当您多次调用此 Asynctask 时,它会冻结您的 activity.
解决方案是,如果你想创建一个SQL连接,检查数据并刷新你需要创建的列表视图:
一个 IntentService,它将连接到数据库,获取数据并检查它,如果数据发生变化,returns 数据。
一个不连接到数据库但获取数据并刷新列表的函数。
因此,通过这种方式,您的连接和数据检查将在后台进行,当数据更改时,asynctask 将调用函数来刷新列表。
它解决了我的问题。新码就是这样,谁要用
刷新列表视图的函数:
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;
}
}
用于连接数据库并检查数据是否已更改的意图服务:
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();
}
}
}
现在不是 freezin,但这段代码仍然是一团糟,稍作修改,它可以更好地工作。写得不错!!