[英]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");
}
}
這是不正確的:
class Connect extends AsyncTask<Void, Void, Integer> {
TextView Text1 = (TextView) findViewById(R.id.textView1);
findViewById
是Activity
類的一種方法。 不是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.