Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图_Android - Fatal编程技术网

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方法我调用控制器类中执行所有操作的另一个方法,并不断调用活动中的静态方法来更新屏幕中的值,但相同的错误仍然存在。可能是什么?谢谢!