Java 将文本视图更新为异步任务

Java 将文本视图更新为异步任务,java,android,android-asynctask,Java,Android,Android 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 clas

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

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");
    }
}
导入android.support.v7.app.app活动;
导入android.os.Bundle;
导入android.os.AsyncTask;
导入android.widget.TextView;
公共类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView显示=(TextView)findViewById(R.id.textView1);
display.setText(“你好,安卓!”);
Connect myConnect=new Connect();
myConnect.execute();
}
}
类连接扩展异步任务{
TextView Text1=(TextView)findViewById(R.id.textView1);
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的整数doInBackground(Void…params){
返回0;
}
@凌驾
受保护的void onProgressUpdate(void…值){
super.onPostExecute(0);
Text1.setText(“文本更改”);
}
}
  • 我错过了什么
  • 如何通过AsyncTask引用TextView
  • 这是不正确的:

    class Connect extends AsyncTask<Void, Void, Integer> {
    
        TextView Text1 = (TextView) findViewById(R.id.textView1);
    
    还有一个错误:

     @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");
        }
    
    总结 //一个文件 公共类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();
        }
    }
    
    //可能是另一个文件。但是您可以将下面的类作为嵌套类—只需将前面的部分移到代码末尾即可 类连接扩展异步任务{ TextView Text1; 公共连接(文本视图电视){ Text1=电视; } @凌驾 受保护的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");
            }
        }
    
    findViewById()在AsyncTask内不可访问,该方法属于活动,因此无法在AsyncTask内使用id初始化视图。请在onCreate内的活动中初始化视图,并在async task中使用实例

    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");
     }
    }}
    
    public类MainActivity扩展了AppCompatActivity{
    文本视图显示;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    display=(TextView)findViewById(R.id.textView1);
    display.setText(“你好,安卓!”);
    Connect myConnect=new Connect();
    myConnect.execute();
    }
    类连接扩展异步任务{
    @凌驾
    受保护的void onPreExecute(){
    }
    @凌驾
    受保护的整数doInBackground(Void…params){
    返回0;
    }
    @凌驾
    受保护的void onProgressUpdate(void…值){
    }
    受保护的void onPostExecute(长结果){
    display.setText(“文本更改”);
    }
    }}
    
    您的文本视图与MainActivity相关,因此仅在activity类中创建全局引用,并将其用于子类

    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");
        }
    }
    
    
    }
    
    导入android.support.v7.app.app活动;
    导入android.os.Bundle;
    导入android.os.AsyncTask;
    导入android.widget.TextView;
    公共类MainActivity扩展了AppCompatActivity{
    TextView Text1;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Text1=(TextView)findViewById(R.id.textView1);
    Text1.setText(“你好,安卓!”);
    Connect myConnect=new Connect();
    myConnect.execute();
    }
    类连接扩展异步任务{
    @凌驾
    受保护的void onPreExecute(){
    }
    @凌驾
    受保护的整数doInBackground(Void…params){
    返回0;
    }
    @凌驾
    受保护的void onProgressUpdate(void…值){
    super.onPostExecute(0);
    Text1.setText(“文本更改”);
    }
    }
    }
    
    在主应用程序线程(又称UI线程)上调用
    onCreate()
    onProgressUpdate()
    的内部使用您的视图

    全球的

    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");
    }
    

    将Text1设为全局,并在postExecute方法setContentView(R.layout.activity_main)中使用settext;是MainActivity的一部分,因此您可以在MainActivity中创建textview的引用,仅用于工作代码检查Ready和Droid Response。问题不清楚,
    Connect
    是否是
    MainActivity
    的内部非静态类?否,那么显然
    AsyncTask
    没有
    findViewById
    方法作为您的答案doesn没有解释问题代码段的错误以及您的版本如何解决问题。显然,字段初始值设定项将在主线程上调用…这是编译时错误,与UI无关thread@Selvin不,伙计,这是我实现的一个工作示例,我说,这是编译时错误:
    error:(26,33)错误:找不到符号方法findViewById(int)
    它与UI线程无关(如果
    Connect
    将是活动的内部而非静态类,它将工作)另外,
    private TextView Text1;
    并不意味着全局…将findViewById移动到onCreate没有意义,因为Conect似乎不是一个内部非静态类,所以它不会修复此错误(但如果它是内部类,那么他的代码会)这是一个嵌套类。你不需要通过构造函数传递它。@MuratK.nope。你是不对的。检查他的妄想:)但是如果它是嵌套的-你是对的:)如果它是嵌套的,那么他就不会得到编译时间error@Selvin,hi可以将该类放入另一个文件中。实际上,这并不重要。是的,可以将此textview用作“共享”变量。但可以将此变量传递给另一个类。这只是一个示例。matterI真的不知道…请看我在其他答案和问题下的评论…我只是确认您所说的…这似乎不是一个内部非静态类(因为如果这样做的话,他的代码编译和工作都不会出现问题——直到重新创建活动时,AsyncTask将被删除。)
    @Override
    protected void onProgressUpdate(Void... values) {
        super.onPostExecute(0);
        Text1.setText("Text Changed");
    }