CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图

时间:2011-12-03 00:35:05

标签: android

我在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,因为很多事情已经完成,我不想再改变了。

谢谢!

2 个答案:

答案 0 :(得分:3)

AsyncTask不会阻止UI。你应该使用它。你想要做的事情正是它的好处。 AsyncTask不需要存在于Activity之外,它是短暂的工作(相对),并且您的工作需要更新此UI。 AsyncTask似乎比服务更合适。

答案 1 :(得分:1)

在异步任务中执行操作特别是不阻止UI线程。它甚至还有一个正在进行的方法来完成你想要做的更新UI。 Gven,你不想这样做,但你需要研究正在运行的方法。

看看这段代码,由于你在静态方法中访问成员变量,我对它是如何工作有些困惑。