繁体   English   中英

在AsyncTask中更新TextView

[英]Updating a TextView out an AsyncTask

我正在尝试将此示例应用于我的项目,但出现以下错误:

Error:(26, 33) error: cannot find symbol method findViewById(int)

这是我的代码的样子:

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;
import android.os.AsyncTask;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView display = (TextView) findViewById(R.id.textView1);
        display.setText("Hello Android!");
        Connect myConnect = new Connect();
        myConnect.execute();
    }
}


class Connect extends AsyncTask<Void, Void, Integer> {

    TextView Text1 = (TextView) findViewById(R.id.textView1);

    @Override
    protected void onPreExecute(){
    }

    @Override
    protected Integer doInBackground(Void... params) {
        return 0;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onPostExecute(0);
        Text1.setText("Text Changed");
    }
}
  • 我在这里想念什么?
  • 如何通过AsyncTask引用TextView?

这是不正确的:

class Connect extends AsyncTask<Void, Void, Integer> {

    TextView Text1 = (TextView) findViewById(R.id.textView1);

findViewByIdActivity类的一种方法。 不是AsyncTask

要解决此问题,请使用以下方法:

Connect myConnect = new Connect(display);

并创建构造函数:

class Connect extends AsyncTask<Void, Void, Integer> {
   TextView Text1;
public Connect(TextView tv) {
Text1 = tv;
}

并且您还有另一个错误:

 @Override
    protected void onProgressUpdate(Void... values) {
        super.onPostExecute(0);
        Text1.setText("Text Changed");
    }

将其更改为:

 @Override
    protected void onProgressUpdate(Integer... values) {
      super.onProgressUpdate(values);
      Text1.setText("Text Changed");
    }

SUMMARIZE //一个文件公共类MainActivity扩展了AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView display = (TextView) findViewById(R.id.textView1);
        display.setText("Hello Android!");
       Connect myConnect = new Connect(display);
        myConnect.execute();
    }
}

//可能是另一个文件。 但是您可以将下面的类作为嵌套放置-只需将先前的括号移到代码类的末尾即可。Connect扩展AsyncTask {TextView Text1; 公共Connect(TextView电视){Text1 = tv; } @Override protected void onPreExecute(){}

        @Override
        protected Integer doInBackground(Void... params) {

        /*publish your progress here
          publishProgress(...);
        */
            return 0;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            Text1.setText("Text Changed");
        }
    }

您的文本视图与MainActivity相关,因此仅在活动类中创建全局引用,并将其用于子类。

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;
import android.os.AsyncTask;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

TextView Text1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Text1 = (TextView) findViewById(R.id.textView1);
        Text1.setText("Hello Android!");
        Connect myConnect = new Connect();
        myConnect.execute();
    }



class Connect extends AsyncTask<Void, Void, Integer> {

    @Override
    protected void onPreExecute(){
    }

    @Override
    protected Integer doInBackground(Void... params) {
        return 0;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onPostExecute(0);
        Text1.setText("Text Changed");
    }
}


}

在AsyncTask中无法访问findViewById(),该方法属于活动,因此您无法在Asynctask中使用id初始化视图。 在onCreate内的活动中初始化您的视图,并在异步任务中使用实例

public class MainActivity extends AppCompatActivity {
TextView display;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        display = (TextView) findViewById(R.id.textView1);
        display.setText("Hello Android!");
        Connect myConnect = new Connect();
        myConnect.execute();
    }


class Connect extends AsyncTask<Void, Void, Integer> {


    @Override
    protected void onPreExecute(){
    }

    @Override
    protected Integer doInBackground(Void... params) {
        return 0;
    }

    @Override
    protected void onProgressUpdate(Void... values) {


    }
    protected void onPostExecute(Long result) {
    display.setText("Text Changed");
 }
}}

onCreate()使用您的视图。 onProgressUpdate()将在主应用程序线程(aka UI线程)上调用。 正如CommansWare所说

全球

private TextView Text1;

用于:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView display = (TextView) findViewById(R.id.textView1); 
    Text1 = (TextView) findViewById(R.id.textView1); //here
       .........

照原样设置

@Override
protected void onProgressUpdate(Void... values) {
    super.onPostExecute(0);
    Text1.setText("Text Changed");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM