在Android中,如何从AsyncTask更改TextView?

时间:2014-01-13 18:56:08

标签: android android-asynctask textview

我有一个带有TextView的启动画面来显示应用程序正在执行的操作,例如“正在更新库”...“正在更新运输”......等我正在使用AsyncTask通过API更新我的数据库。< / p>

我将更新文本传递给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);

    }

...

我的计划是更改doInBackground方法中的文本,但在AsyncTask中无法访问findViewById。我想我需要使用setContentView来允许findViewById工作,但我不确定如何。

我的java文件是SplashScreen.java,我的xml是activity_splash_screen.xml

-----编辑-----

有关更多信息,我有三件相互交谈:

SplashScreen.java - &gt;调用baseActivity.java中的方法 - &gt;方法将数据发送到JSONParser.java - &gt;将解析后的JSON从API发送到baseActivity.java以更新数据库

根据以下建议我已宣布

statusMessage = (TextView) findViewById(R.id.statusMessage);

在baseActivity.java的onCreate中,因为它是调用AsyncTask的文件。

在JSONParser.java中我已经完成了这个,现在:

public class JSONParser extends AsyncTask<String, String, JSONObject> {

    static InputStream is = null;
    static JSONObject json = null;
    static String outPut = "";

    TextView statusMessage;

    @Override
    protected JSONObject doInBackground(String... params) {
        // TODO Auto-generated method stub
    ...
    }


    protected void onProgressUpdate() {
        statusMessage.setText("testing");
     }

    protected void onPostExecute(JSONObject result) {


    }
}

我只是在那里使用“测试”进行测试。

4 个答案:

答案 0 :(得分:3)

  

我的计划是更改doInBackground中的文本

糟糕的计划!您无法从后台UI更新Thread。您需要在onPostExecute()onProgressUpdate()

中执行此操作
  

但是在AsyncTask中无法访问findViewById。

如果这是Activity的内部类,则初始化View中的Activity,然后按照上述说明在您的任务中更新它。

如果它是自己的文件,那么您需要使用interface并回复AcitivtyonPostExecute()onPreExecute()中的onProgressUpdate() }。您可以看到in this SO answer的示例。

  

我想我需要使用setContentView来允许findViewById

当然!但如上所述,请在执行任务之前执行此操作,例如onCreate()的{​​{1}}。

修改

Activity需要onProgressUpdate(),但您的param不是,所以它不是同一种方法。这就是为什么当你有onProgressUpdate()这是注释点时抱怨的原因。它抱怨并且你知道你认为你要覆盖一种方法,所以你知道它有问题。

将其更改为

@Override

protected void onProgressUpdate(Void...values) { statusMessage.setText("testing"); } 链接

http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)

答案 1 :(得分:1)

你应该使用onProgressUpdate,该方法可以访问ui线程。

public class yourAsync extends AsyncTask<> {

  @Override
  protected void onProgressUpdate() {
    textView.setText();
  }

}

答案 2 :(得分:1)

在你的活动中加入这样的东西

处理程序statusUpdateHandeler = new Handler()........

在你的线程中,调用处理程序(发送消息)

MainActivity.statusUpdateHandler.sendEmptyMessage(1);

在您的实际处理程序代码中,设置状态消息。

答案 3 :(得分:0)

I think I need to use setContentView to allow findViewById to work but I'm not sure how.

是。您需要在onCreate中使用setContentView(R.layout.activity_splash_screen)

您可以在onCreate中初始化视图make 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更好。您可以在onProgressUpdate()

中发布doInbackground中的进度并更新进度对话框

http://developer.android.com/reference/android/os/AsyncTask.html