如何使用AsyncTask分配全局变量

时间:2013-12-15 12:31:04

标签: java android android-asynctask global-variables

这里我给出了一个我用全局变量和AsyncTasks面临的问题的小例子。我已经去读取文件中的数据并将该数据分配给字符串,并且在onPostExecute()方法中我将该字符串分配给全局变量。但是,当我为TextView分配“aString”变量时,输出仍然是“无”。

我知道如果你在onPostExecute()方法中进行TextView分配,那么如果我想在AsyncTask之外的方法中使用数据,那该怎么办呢。

有人可以帮忙解决这个问题,我想我没有得到什么?

public class GoodAsync extends Activity{

    TextView tv;
    String aString = "nothing";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.asynctasks);

        new AsyncTasker().execute();

        tv = (TextView) findViewById(R.id.async_view);
        tv.setText(aString);

    }

    private class AsyncTasker extends AsyncTask<String, Integer, String>{

        @Override
        protected String doInBackground(String... arg0) {

            AssetManager am = GoodAsync.this.getAssets();
            String string = "";
            try {
                // Code that reads a file and stores it in the string variable

                return string;

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            aString = result;
        }   

    }
}

3 个答案:

答案 0 :(得分:1)

也许你想这样做:

public class GoodAsync extends Activity{

TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.asynctasks);
    tv = (TextView) findViewById(R.id.async_view);
    new AsyncTasker().execute();
}

    public void setTextView (String text) {
       tv.setText(text);
    }

    private class AsyncTasker extends AsyncTask<String, Integer, String>{

        ....

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            setTextView(result);
        }   

    }
}

答案 1 :(得分:0)

你确定你的AsyncTask正在及时执行吗?

例如你这样做:

new AsyncTasker().execute();
tv = (TextView) findViewById(R.id.async_view);
tv.setText(aString);

这将设置任务,但随后立即将TextView的值设置为aString变量。

AsyncTask很可能仍然在此时执行,因此aString只在代码执行后获得除“nothing”之外的值。

答案 2 :(得分:-1)

你不是在等待你的asynctask完成..你可以这样做..

new AsyncTasker().execute().get();
tv = (TextView) findViewById(R.id.async_view);
tv.setText(aString);