正如标题所述,我试图在运行asynctask时在我的UI线程中更新某些内容..我已经阅读了很多关于asynctask的内容,看起来我应该能够更改一个 来自onPostExecute()方法的变量。显然事实并非如此。
以下是我的示例代码:
TextView tv = (TextView) findViewById(R.id.thingsThatNeedToBeUpdated);
Login login = new Login();
login.execute(userName, password);
这里是登录类
public class Login extends AsyncTask<String, void, String>{
public String doInBackground(String... params){
logMeIn(params[0], params[1]);
}
public void onPostExecute(String update){
tv.setText(result); //this is not working!!
}
实际上发生了什么是电视加下划线红色和eclipse说我需要创建一个局部变量..但我认为onPostExecute是从UI线程运行的?困惑:?
我试图做我在this网站上发现的事情。我并不十分肯定我在做什么,我会喜欢正确的方向!提前致谢。
答案 0 :(得分:1)
这一行
TextView tv = (TextView) findViewById(R.id.thingsThatNeedToBeUpdated);
显然是宣布
tv
为null
或AsyncTask
的方法中 - 这意味着。{
任务无权访问您应该将其定义为成员变量(在方法之外)
TextView tv;
然后在方法
中初始化它tv = (TextView) findViewById(R.id.thingsThatNeedToBeUpdated);
这将使您的任务以及课程的其余部分都可以访问它。
如果您的AsyncTask
是一个单独的文件而不是Activity
,那么您需要see this answer使用interface
并创建回调来更新TextView
在Activity
。
答案 1 :(得分:0)
要将TextView
实例放入范围,请将您的tv变量传递到Login
实例构造函数中,并按如下所示添加构造函数和变量。
public class Login extends AsyncTask<String, void, String>{
private TextView tv;
public Login(TextView tv){
this.tv = tv;
}
public String doInBackground(String... params){
logMeIn(params[0], params[1]);
}
public void onPostExecute(String update){
tv.setText(result); //this should work
}
}
您必须将变量传递给此实例,否则它将超出范围。除非您在Login
类中声明并实例化新变量,否则您将无法访问它。
答案 2 :(得分:0)
将TextView tv;
放入类的范围内以及函数外部。将tv = (TextView) findViewById(R.id.thingsThatNeedToBeUpdated);
留在原处。然后,您应该可以从tv
访问onPostExecute()
。
答案 3 :(得分:0)
这是因为TextView变量tv是在另一个没有Login作为内部类的类中定义的。如果Login是包含变量tv的类的内部类,它应该能够看到变量tv。
解决这个问题的一个简单方法是让AsyncTask成为主类的内部类。