我在IntentService
中的数据库中进行操作,并在显示CustomProgressBar的Activity
中进行操作,但我还要显示百分比值。因此,为此,我在IntentService中获取百分比值,并在Activity中的静态方法中设置此值。但错误出现了:
CalledFromWrongThreadException:仅创建的原始线程 视图层次结构可以触及其视图。
我不想在AsyncTask中执行此操作因为我不想阻止UI,所以我使用的是IntentService。
以下是我的表现方式。
MyIntentService.java
public class MyIntentService扩展了IntentService { @覆盖 public void onHandleIntent(Intent intent) { 更新数据库(); }
public void updateDatabase()
{
resetPercentage(cursor.getCount * 2)
do
{
// do operation for updating the database
// here I update the view everytime a new item is inserted in DB.
int updatedReturn = MyActivity.updatePercentageValue(percentage());
}
while(...)
}
public void resetPercentage(int elementsNum)
{
mUpdatePercentage = 0;
mMaxItems = elementsNum;
}
public int incrementPercentageCounter()
{
return ++mPercentageCounter;
}
public int percentage()
{
int value = (mPercentageCounter/mMaxItems)*100;
return (value > 100) ? 100 : value;
}
}
MyActivity.java
public class MyActivity extends Activity
{
private TextView mMyTextView;
@Override
public void onCreate(Bundle bundle)
{
super.onCreate(bundle);
mMyTextView = (TextView) findViewById(R.id.textview);
}
public static int updatePercentageValue(int percentageValue)
{
mMyTextView.setText("" + percentageValue + " %");
return 1;
}
}
任何想法如何解决此问题或使用我的IntentService执行此操作,以便UI不会被阻止。
Obs:我也想继续使用IntentService,因为很多事情已经完成,我不想再改变了。
谢谢!
答案 0 :(得分:3)
AsyncTask不会阻止UI。你应该使用它。你想要做的事情正是它的好处。 AsyncTask不需要存在于Activity之外,它是短暂的工作(相对),并且您的工作需要更新此UI。 AsyncTask似乎比服务更合适。
答案 1 :(得分:1)
在异步任务中执行操作特别是不阻止UI线程。它甚至还有一个正在进行的方法来完成你想要做的更新UI。 Gven,你不想这样做,但你需要研究正在运行的方法。
看看这段代码,由于你在静态方法中访问成员变量,我对它是如何工作有些困惑。