Android 复杂操作的缓慢性能

Android 复杂操作的缓慢性能,android,sqlite,listview,android-asynctask,Android,Sqlite,Listview,Android Asynctask,伙计们 我设计了一个货币兑换应用程序,在该应用程序中,我在应用程序启动时获得所有汇率,并创建自己的SQLite DB,然后轻松地将它们拉入转换器接口。我已经设计了在我的Edittext-ContextChanged监听器中使用textwatcher进行更改,所有这些都可以完美地工作。在同一个活动中,我也有一个列表视图,可以查看最喜欢的汇率,并且每次编辑文本更改时都必须计算它。我的主要问题是,我的应用程序性能缓慢,并且存在冻结问题。我曾尝试实现Asynctask来处理计算,但它对我没有帮助,我仍然

伙计们

我设计了一个货币兑换应用程序,在该应用程序中,我在应用程序启动时获得所有汇率,并创建自己的SQLite DB,然后轻松地将它们拉入转换器接口。我已经设计了在我的Edittext-ContextChanged监听器中使用textwatcher进行更改,所有这些都可以完美地工作。在同一个活动中,我也有一个列表视图,可以查看最喜欢的汇率,并且每次编辑文本更改时都必须计算它。我的主要问题是,我的应用程序性能缓慢,并且存在冻结问题。我曾尝试实现Asynctask来处理计算,但它对我没有帮助,我仍然遇到性能问题。以下是我的代码,供您参考。请指教

文本观察者:

valval.addTextChangedListener(new TextWatcher() {

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {



        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

        }

        public void afterTextChanged(final Editable s)

        {

            Calculate();

        }
    });
计算:

private void Calculate()

{

    curs = mDb.query(MyDbHelper.TABLE_NAME, columns, MyDbHelper.COL_Common
            + "=" + "?", new String[] { From[xxxto] + From[xxxfrom] },
            null, null, null);
    cursD = mDb.query(MyDbHelper.TABLE_NAME, columns, MyDbHelper.COL_Common
            + "=" + "?", new String[] { From[xxxfrom] + From[xxxto] },
            null, null, null);

    curs.moveToFirst();

    cursD.moveToFirst();

    double selection = curs.getDouble(curs
            .getColumnIndex(MyDbHelper.COL_Currone));

    double selection2 = cursD.getDouble(cursD
            .getColumnIndex(MyDbHelper.COL_Currone));

    Long myNum = Long.parseLong(valval.getText().toString().trim());

    double myNum3 = Double.parseDouble(new DecimalFormat("#.######").format(myNum * selection2));


    valval2.setText(String.valueOf(myNum3));



    Cursor B = mDb.query(MyDbHelper.TABLE_NAME, columns,
            MyDbHelper.COL_CurrFavor + " LIKE ? And "
                    + MyDbHelper.COL_Currsecond + " LIKE ?", new String[] {
                    "YES", "EUR" }, null, null, null);


    for (int s = 0; s < B.getCount() - 1; s++)

    {
        B.moveToPosition(s);

        String ZVZV = B.getString(0);

        int BSBS = B.getInt(9);


        Cursor curcur = mDb.query(MyDbHelper.TABLE_NAME, columns, MyDbHelper.COL_Common
                + "=" + "?", new String[] { From[xxxfrom] + From[BSBS-1] },
                null, null, null);

        curcur.moveToFirst();

        double calcal = curcur.getDouble(6);



        ContentValues args = new ContentValues();

        double formattedNumber = Double.parseDouble(new DecimalFormat("#.######").format(myNum * calcal));

        args.put(MyDbHelper.COL_Currsum,formattedNumber );

        mDb.update(MyDbHelper.TABLE_NAME, args, "_id =" + ZVZV, null);



    }

    cursm.requery();

}
private void Calculate()
{
curs=mDb.query(MyDbHelper.TABLE\u名称、列、MyDbHelper.COL\u公共
+“=”+“?”,新字符串[]{From[xxxto]+From[xxxfrom]},
空,空,空);
cursD=mDb.query(MyDbHelper.TABLE\u名称、列、MyDbHelper.COL\u公共
+“=”+“?”,新字符串[]{From[xxxfrom]+From[xxxto]},
空,空,空);
curs.moveToFirst();
诅咒。移动到第一个();
double selection=curs.getDouble(curs
.getColumnIndex(MyDbHelper.COL_Currone));
double selection2=cursD.getDouble(cursD
.getColumnIndex(MyDbHelper.COL_Currone));
Long myNum=Long.parseLong(valval.getText().toString().trim());
double myNum3=double.parseDouble(新的十进制格式(“#.###########”)格式(myNum*selection2));
valval2.setText(String.valueOf(myNum3));
游标B=mDb.query(MyDbHelper.TABLE_名称、列、,
MyDbHelper.COL_currLover+“喜欢吗?和”
+MyDbHelper.COL_Currsecond+“LIKE?”,新字符串[]{
“是”、“欧元”},空、空、空);
对于(int s=0;s
从您的描述中,我可以想象到,您很可能有两个EditText,其中用户只向第一个文本输入,然后您将同步第二个文本的转换值,这是真的吗?如果是,我可以建议您不要在每次文本更改后立即执行该操作吗

您可能只想在用户完成输入后执行
Calculate()
,也许可以接受一秒钟的计算延迟

// Declare these as class variable
private Handler handler = new Handler();
private Runnable calculateRunnable = new Runnable() {
    public void run() {
        Calculate();
    }
}
至于你的TextWatcher,改变这个

public void afterTextChanged(final Editable s) {
    handler.removeCallbacks(calculateRunnable);
    handler.postDelayed(calculateRunnable, 1000);
}

从你的描述中我能想象到的是,你很可能有两个EditText,其中用户只输入第一个,然后你将同步第二个转换值,这是真的吗?如果是,我可以建议您不要在每次文本更改后立即执行该操作吗

您可能只想在用户完成输入后执行
Calculate()
,也许可以接受一秒钟的计算延迟

// Declare these as class variable
private Handler handler = new Handler();
private Runnable calculateRunnable = new Runnable() {
    public void run() {
        Calculate();
    }
}
至于你的TextWatcher,改变这个

public void afterTextChanged(final Editable s) {
    handler.removeCallbacks(calculateRunnable);
    handler.postDelayed(calculateRunnable, 1000);
}

您真的需要为此使用数据库吗?我相信一位SQL专家会告诉您,您的查询效率很低,但为什么不使用共享首选项呢?因为根据汇率,我的数据库中大约有4700行,我认为我在共享首选项部分没有这样的经验。任何帮助都将不胜感激!你能稍微细分一下吗?比如470种货币,每种货币10个条目,或者47种货币,每种100个条目?是否有其他应用程序使用您的数据库?我将尝试找到一种方法,我的数据库不会共享给任何其他应用程序。我只是想了解您的数据结构。基本上,我会认真考虑使用数组来实现这一点,如果需要在活动之间共享数据,那么使用共享预置(简单使用)。正如我所说的,数据库专家可能会告诉你如何改进你的查询——在缺乏专业知识的情况下——将你的查询划分为更简单的查询,你自己可能就能发现问题。你真的需要为此使用数据库吗?我相信一位SQL专家会告诉您,您的查询效率很低,但为什么不使用共享首选项呢?因为根据汇率,我的数据库中大约有4700行,我认为我在共享首选项部分没有这样的经验。任何帮助都将不胜感激!你能稍微细分一下吗?比如470种货币,每种货币10个条目,或者47种货币,每种100个条目?是否有其他应用程序使用您的数据库?我将尝试找到一种方法,我的数据库不会共享给任何其他应用程序。我只是想了解您的数据结构。基本上,我会认真考虑使用数组来实现这一点,如果需要在活动之间共享数据,那么使用共享预置(简单使用)。正如我所说,数据库专家可能会告诉你如何改进你的查询-在缺乏专业知识的情况下-将你的查询划分为更简单的查询,你可能会自己发现问题。感谢Chor的建议,这非常有用。我认为我的复杂操作从定义“游标B”开始,一直到结束。我将它们标记为/*并发现所有其他事务都非常好,性能也很好。我想我应该研究一下。通常数据库写入操作(磁盘IO)会花费你相当多的处理资源,更不用说你看起来会这么做