我的 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,但这段代码仍然是一团糟,稍作修改,它可以更好地工作。写得不错!!