在Android中,如何从异步任务更改TextView?

在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

我有一个带有文本视图的启动屏幕,可以显示应用程序正在执行的操作,例如“更新库”。。。“更新配送”。。。我正在使用AsyncTask通过API更新我的数据库

我正在将更新文本传递给AsyncTask。我需要更改
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
成为您的splash
Acitivity
的内部类。我在onCreate“baseActivity.java”中初始化了它,它在JSONParser.java中调用AsyncTask。我试着初始化它JSONParser.java,但这就是我遇到问题的地方。是的,因为您的
AsyncTask
无权访问它。按照我上一篇文章中的两条建议中的一条去做