Moh*_*dan 1 android listview cursor uiview android-asynctask
我的Async任务遇到问题.我有一些正常的操作要在后台完成,并在完成后查看结果,但是尽管我的代码在doinbackground块中,但UI仍会冻结.请帮我!
下面是我的代码.
class DownloadFileFromURL extends AsyncTask<String, Void, String> {
    /**
     * Before starting background thread Show Progress Bar Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pd = ProgressDialog.show(Interface.this, null, "Loading...", true);
    }
    /**
     * Downloading file in background thread
     * */
    @Override
    protected String doInBackground(String... f_url) {
        //
        // Toast.makeText(getApplicationContext(), "Executing",
        // 3000).show();
        runOnUiThread(new Runnable() {
            public void run() {
                Calculate();
            }
        });
        return null;
    }
    /**
     * Updating progress bar
     * */
    protected void onProgressUpdate(String... progress) {
        // setting progress percentage
    }
    /**
     * After completing background task Dismiss the progress dialog
     * **/
    @Override
    protected void onPostExecute(String file_url) {
        pd.dismiss();
    }
}
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
                    + "=? And " + MyDbHelper.COL_Currsecond + "=?",
                    new String[] { "YES", "EUR" }, null, null, null);
    */          
    Cursor B = mDb.rawQuery("select * from "
            + MyDbHelper.TABLE_NAME + " where " + MyDbHelper.COL_CurrFavor + " = ? AND  "
            + MyDbHelper.COL_Currsecond + " = ?", new String[] { "YES", "EUR" });
    for (int s = 0; s < 4 - 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();
}
这是Logcat中的错误:
12-20 04:41:38.469:E/AndroidRuntime(440):引起:android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图.
我也运行它:new DownloadFileFromURL2().execute("");
不要不要不要做这AsyncTask
runOnUiThread(new Runnable() {
        public void run() {
AsyncTask运行中的每个方法UI Thread除外doInBackground().您的工作doInBackground()(您的计算,网络操作等)然后从中获取结果并通过调用更新UIin onProgressUpdate(),publishProgress()或者如果后台工作完成,则返回结果onPostExecute()并在那里更新.
如果这不能解决您当前的问题,那么请发布您如何调用任务...希望不会.get().
编辑
此外,你应该再次查看文档,你实际上并没有传递任何东西,doInBackground()只是空洞String的.execute()
new DownloadFileFromURL2().execute("");
所以你可以param将声明的第一个改为Void
class DownloadFileFromURL extends AsyncTask<Void, Void, String> {
并没有传递任何东西
new DownloadFileFromURL2().execute();
除非您计划稍后更新.您还没有通过onPostExecute()从任何doInBackground()与
return null;
所以你可以改变params它.所以现在我们有了
class DownloadFileFromURL extends AsyncTask<Void, Void, Void> {
和
 @Override
protected void onPostExecute(Void result) {
你再次在任务类声明中onProgressUpdate()取消params(第二param)
class DownloadFileFromURL extends AsyncTask<Void, Void, Void> {
所以看起来应该是这样的
 protected void onProgressUpdate(Void... progress) {
    // setting progress percentage
}
当然,这些都取决于你计划传递它们的方法,你需要通过一些东西来更新UI你的Calculate()方法得到的结果.
| 归档时间: | 
 | 
| 查看次数: | 5421 次 | 
| 最近记录: |