簡體   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