在Android中,如何从异步任务更改TextView?
我有一个带有文本视图的启动屏幕,可以显示应用程序正在执行的操作,例如“更新库”。。。“更新配送”。。。我正在使用AsyncTask通过API更新我的数据库 我正在将更新文本传递给AsyncTask。我需要更改在Android中,如何从异步任务更改TextView?,android,android-asynctask,textview,Android,Android Asynctask,Textview,我有一个带有文本视图的启动屏幕,可以显示应用程序正在执行的操作,例如“更新库”。。。“更新配送”。。。我正在使用AsyncTask通过API更新我的数据库 我正在将更新文本传递给AsyncTask。我需要更改TextView statusMessage中的文本。我正在尝试这样做: public class JSONParser extends AsyncTask<String, String, JSONObject> { static InputStream is = nu
TextView statusMessage
中的文本。我正在尝试这样做:
public class JSONParser extends AsyncTask<String, String, JSONObject> {
static InputStream is = null;
static JSONObject json = null;
static String outPut = "";
TextView statusMessage;
@Override
protected void onPreExecute() {
statusMessage = (TextView) findViewById(R.id.statusMessage);
}
...
我只是用“测试”来进行测试
I think I need to use setContentView to allow findViewById to work but I'm not sure how.
对。您需要在onCreate中使用setContentView(R.layout.activity\u启动屏幕)
您可以在onCreate中初始化视图,使asynctask成为活动的内部类,并在onPreExecute
中更新ui
TextView statusMessage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
statusMessage = (TextView) findViewById(R.id.statusMessage);
}
您还可以使用progressdialog并显示消息。我认为使用progressdialog比textview更好。您可以在doInbackground中发布进度,并在onProgressUpdate()中更新进度对话框
对。您需要在onCreate中使用setContentView(R.layout.activity\u启动屏幕)
您可以在onCreate中初始化视图,使asynctask成为活动的内部类,并在onPreExecute
中更新ui
TextView statusMessage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
statusMessage = (TextView) findViewById(R.id.statusMessage);
}
您还可以使用progressdialog并显示消息。我认为使用progressdialog比textview更好。您可以在doInbackground中发布进度,并在onProgressUpdate()中更新进度对话框
您应该使用onProgressUpdate,该方法可以访问ui线程
public class yourAsync extends AsyncTask<> {
@Override
protected void onProgressUpdate() {
textView.setText();
}
}
公共类yourAsync扩展了AsyncTask{
@凌驾
受保护的void onProgressUpdate(){
setText();
}
}
您应该使用onProgressUpdate,该方法可以访问ui线程
public class yourAsync extends AsyncTask<> {
@Override
protected void onProgressUpdate() {
textView.setText();
}
}
公共类yourAsync扩展了AsyncTask{
@凌驾
受保护的void onProgressUpdate(){
setText();
}
}
我的计划是更改doInBackground中的文本
糟糕的计划!您无法从后台线程更新UI
。您需要在onPostExecute()
或onProgressUpdate()中执行此操作
但在AsyncTask中无法访问findViewById
如果这是活动的内部类
,则在活动
中初始化视图
,然后在任务中更新它,如上所述
如果它是自己的文件,那么您将希望使用接口
,并在onPostExecute()
、onPreExecute()
或onProgressUpdate()
中回调acitivity
。你可以看到一个例子
我想我需要使用setContentView来允许findViewById
当然!但是如上所述,在执行任务之前,例如在活动的onCreate()
中执行此操作
编辑
onProgressUpdate()
接受一个param
,但您的onProgressUpdate()
不接受,因此它不是相同的方法。这就是为什么当你有@覆盖
时它会抱怨,这就是注释的要点。它会抱怨,您知道您应该重写一个方法,所以您知道它有问题
换成
protected void onProgressUpdate(Void...values) {
statusMessage.setText("testing");
}
onProgressUpdate()
link
我的计划是更改doInBackground中的文本
糟糕的计划!您无法从后台线程更新UI
。您需要在onPostExecute()
或onProgressUpdate()中执行此操作
但在AsyncTask中无法访问findViewById
如果这是活动的内部类
,则在活动
中初始化视图
,然后在任务中更新它,如上所述
如果它是自己的文件,那么您将希望使用接口
,并在onPostExecute()
、onPreExecute()
或onProgressUpdate()
中回调acitivity
。你可以看到一个例子
我想我需要使用setContentView来允许findViewById
当然!但是如上所述,在执行任务之前,例如在活动的onCreate()
中执行此操作
编辑
onProgressUpdate()
接受一个param
,但您的onProgressUpdate()
不接受,因此它不是相同的方法。这就是为什么当你有@覆盖
时它会抱怨,这就是注释的要点。它会抱怨,您知道您应该重写一个方法,所以您知道它有问题
换成
protected void onProgressUpdate(Void...values) {
statusMessage.setText("testing");
}
onProgressUpdate()
link
在您的活动中加入类似的内容
Handler StatusUpdateHandler=新的Handler()
在线程中,调用处理程序(向其发送消息)
MainActivity.statusUpdateHandler.sendEmptyMessage(1)
在实际处理程序代码中,设置状态消息。在活动中放置类似的内容
Handler StatusUpdateHandler=新的Handler()
在线程中,调用处理程序(向其发送消息)
MainActivity.statusUpdateHandler.sendEmptyMessage(1)
在实际的处理程序代码中,设置状态消息。您可以使用处理程序更新TextView(需要在UI线程上发布更新)。您可以使用处理程序更新TextView(需要在UI线程上发布更新)。我已经用最近的更改更新了问题。然而,文本还没有改变。我丢失了一块吗?是的,我在任何地方都看不到初始化的statusMessage
。无论如何,您需要使用我链接到的回调/接口方法,或者使AsyncTask
成为您的splashAcitivity
的内部类。我在onCreate“baseActivity.java”中初始化了它,它在JSONParser.java中调用AsyncTask。我试着初始化它JSONParser.java,但这就是我遇到问题的地方。是的,因为您的AsyncTask
无权访问它。按照我上一篇文章中的两条建议中的一条去做