Android CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图
我在Android CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图,android,Android,我在IntentService中的数据库中进行操作,在活动中显示CustomProgressBar,但我还想显示百分比值。因此,我在IntentService中获取百分比值,并在活动的静态方法中设置该值。但是错误出现了: CalledFromErrorThreadException:仅创建的原始线程 视图层次可以触及其视图 我不想在异步任务中执行此操作,因为我不想阻止UI,所以我使用的是IntentService 以下是我是如何做到这一点的 MyIntentService.java public
IntentService
中的数据库中进行操作,在活动中显示CustomProgressBar,但我还想显示百分比值。因此,我在IntentService中获取百分比值,并在活动的静态方法中设置该值。但是错误出现了:
CalledFromErrorThreadException:仅创建的原始线程
视图层次可以触及其视图
我不想在异步任务中执行此操作,因为我不想阻止UI,所以我使用的是IntentService
以下是我是如何做到这一点的
MyIntentService.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;
}
}
公共类MyIntentService扩展了IntentService
{
@凌驾
处理内容上的公共无效(意图)
{
updateDatabase();
}
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,因为很多事情都已经完成了,我不想再次改变。
谢谢!在异步任务中执行操作是为了不阻塞UI线程。它甚至有一个正在进行的方法,通过更新UI.Gven来完成您不想做的事情,但您需要查看正在运行的方法
看着这段代码,我有点困惑它是如何工作的,因为您是在静态方法中访问成员变量的。在异步任务中执行操作就是为了不阻塞UI线程。它甚至有一个on-progress方法来完成您想做的事情,即更新UI.Gven,您不想这样做,但您不需要这样做o研究运行方法
看着这段代码,我有点困惑它是如何工作的,因为您是在静态方法中访问成员变量的。异步任务不会阻止UI。您可能应该使用它。您尝试做的事情正是它的好处。异步任务不需要存在于您的活动之外,它是短期工作(相对而言),您的工作需要更新此UI。这里的异步任务似乎比服务更合适。异步任务不会阻止UI。您可能应该使用它。您尝试做的事情正是它的好处。异步任务不需要存在于您的活动之外,它是短期工作(相对而言),并且您的工作需要更新此UI。异步任务似乎比此处的服务更合适。此处的活动代码似乎不完整或与您的活动代码不同。mMyTextView
是否应与mPercentageValueTextView
相同?是否应为静态变量?您确实应该避免使用这类东西的静态访问器。这不是一个好主意。这里的活动代码似乎不完整或与现有代码不同。mMyTextView
应该与mPercentageValueTextView
是同一个变量吗?应该是静态变量吗?你真的应该避免使用静态访问器进行此类访问ng.这不是一个好主意。在AsyncTask内部调用IntentService是一个好主意吗?这不会有任何影响,但正如上面的回答所述,服务并不是你真正想要的,但它应该工作得很好。在取得一些进展后,你可以告诉Android你有一些进展要报告-我忘记了方法名称,但检查了文档中的Async任务和该方法然后使用UI线程调用onProgressDisplay,以便您可以更新UI。我只想将控制代码与视图代码分开。但如果我在异步任务中调用IntentService,我将创建另一个线程,对吗?但IntentService在工作完成后停止自己,对吗?从As调用IntentServiceyncTask不会有帮助。你仍然会遇到同样的问题,即如何将你的进度从IntentService传递到AsyncTask。重构其实并不难。花点时间,以正确的方式完成。我在Activity类和doInBackground()中创建了一个AsyncTask方法我调用控制器类中执行所有操作的另一个方法,并不断调用活动中的静态方法来更新屏幕中的值,但同样的错误仍然存在。这可能是什么?谢谢!在异步任务中调用IntentService是一个好主意吗?这不会造成任何影响,但正如上面的回答所述,是一个service不是你真正想要的,但它应该可以正常工作。在取得一些进展后,你可以告诉Android你有一些进展要报告-我忘记了方法名称,但检查了AsyncTask的文档,然后该方法使用UI线程调用onProgressDisplay,这样你就可以更新UI了。我只想将控制代码与视图代码分开.但是如果我在异步任务中调用IntentService,我会创建另一个线程,对吗?但是IntentService在工作完成后会停止自己,对吗?从异步任务调用IntentService不会有帮助。您仍然会遇到同样的问题,即如何将您的进度从IntentService传递到异步任务。这是错误的重构并不是那么难。花点时间,用正确的方法进行重构。我在Activity类和doInBackground()中创建了一个AsyncTask方法我调用控制器类中执行所有操作的另一个方法,并不断调用活动中的静态方法来更新屏幕中的值,但相同的错误仍然存在。可能是什么?谢谢!