在asynctask中更新UI线程

时间:2014-03-07 18:29:35

标签: java android multithreading android-asynctask

正如标题所述,我试图在运行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网站上发现的事情。我并不十分肯定我在做什么,我会喜欢正确的方向!提前致谢。

4 个答案:

答案 0 :(得分:1)

这一行

TextView tv = (TextView) findViewById(R.id.thingsThatNeedToBeUpdated);

显然是宣布

  1. 方法之外 - 这会导致tvnull
  2. 在一个不属于AsyncTask的方法中 - 这意味着。{ 任务无权访问
  3. 您应该将其定义为成员变量(在方法之外)

    TextView tv;
    

    然后在方法

    中初始化它
    tv = (TextView) findViewById(R.id.thingsThatNeedToBeUpdated);
    

    这将使您的任务以及课程的其余部分都可以访问它。

    如果您的AsyncTask是一个单独的文件而不是Activity,那么您需要see this answer使用interface并创建回调来更新TextViewActivity

答案 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成为主类的内部类。