我的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(“”);
答案 0 :(得分:5)
不要不在AsyncTask
runOnUiThread(new Runnable() {
public void run() {
AsyncTask
中的每个方法都在UI Thread
上运行,但doInBackground()
除外。在doInBackground()
(您的计算,网络操作等)中完成工作然后从中获得结果并通过调用UI
更新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()
。
答案 1 :(得分:1)
这是你做错了。
runOnUiThread(new Runnable() {
public void run() {
Calculate();
}
});
您在此处再次调用UI线程中的Calculate()
方法。这就是你的应用冻结的原因。只需在Calculate()
内拨打doInBackground()
即可。
答案 2 :(得分:1)
你在UI线程上调用Calculate()。它肯定会冻结UI。 从calculate()中删除所有Ui内容并直接在Async中调用它。