静态异步任务Android错误

静态异步任务Android错误,android,static,android-asynctask,Android,Static,Android Asynctask,我是Android开发的新手,我正在学习一些东西,现在,我在静态AsynTask类中遇到了这个错误。。。但是我不理解你的问题。有人能帮我吗?。先谢谢你 public class MainActivity extends Activity { private String BASE_URL = "http://xx.xx.xx.xx:8084/myapp"; User[] users; private EditText name; private EditTe

我是Android开发的新手,我正在学习一些东西,现在,我在静态AsynTask类中遇到了这个错误。。。但是我不理解你的问题。有人能帮我吗?。先谢谢你

public class MainActivity extends Activity {

    private String BASE_URL = "http://xx.xx.xx.xx:8084/myapp";

    User[] users;

    private EditText name;
    private EditText city;
    private EditText country;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String url = this.BASE_URL + "/rest/auth2.json";

        name = (EditText) findViewById(R.id.name);
        city = (EditText) findViewById(R.id.city);
        country = (EditText) findViewById(R.id.country);

        MiTarea myTask = new MiTarea(this);

        Log.i("APPINFO", "Ejecuta tarea asincrona");
        myTask.execute(url);

        name.setText(this.users[0].getName());
        city.setText(this.users[0].getCity().getName());
        country.setText(this.users[0].getCity().getCountry().getI18n_key());
    }

    public void setUsers(User[] users){

        this.users = users;
    }

    static class MiTarea extends AsyncTask<String, Integer, Boolean> {

        WeakReference<MainActivity> context;

        RestTemplate restTemplate;
        User[] userResp;

        HttpEntity<?> requestEntity;

        public MiTarea(MainActivity activity) {
            this.context = new WeakReference<MainActivity>(activity);
        }

        protected void onPreExecute() {

        }

        protected Boolean doInBackground(String... params) {

            String url = params[0];

            try {

                HttpHeaders requestHeaders = new HttpHeaders();
                requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json")));

                requestEntity = new HttpEntity<Object>(requestHeaders);

                // Create a new RestTemplate instance
                restTemplate = new RestTemplate();

                // Add the Jackson message converter
                restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

                // Make the HTTP GET request, marshaling the response from JSON to an
                // array of Events
                ResponseEntity<User[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity,User[].class);
                userResp = responseEntity.getBody();

                Log.i("APPINFO", "CORRECTO");
            } catch (RestClientException ex) {
                Log.i("APPINFO", "ERROR");
                Log.e("APPERROR", ex.toString());
            }


            return true;
        }

        protected void onProgressUpdate(Integer... values) {

        }

        protected void onPostExecute(Boolean result) {

            MainActivity activity = context.get();
            if (activity != null && !activity.isFinishing()) {

                activity.setUsers(userResp);
            }
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

在com.myapp.MainActivity.onCreate(MainActivity.java:53)上有一个
NullPointerException。如堆栈跟踪中所述

您正在异步任务结束时调用
setUsers()
,但试图在任务实际完成之前读取
users
变量,因此
users
为空

您需要移动此代码:

name.setText(this.users[0].getName());
city.setText(this.users[0].getCity().getName());
country.setText(this.users[0].getCity().getCountry().getI18n_key());

以确保仅在AsyncTask完成后调用它。也许可以将其添加到setUsers()方法中?但是,如果这样做,则无法直接从AsyncTask线程更新UI-您需要使用

从数组值中获取值,但未对此数组进行初始化或设置。在setUsers()方法之后调用以下行


解决了,异步概念让我困惑

在MainActivity中而不是在SetUser中(用户[])

在异步任务中

protected void onPostExecute(Boolean result) {

    MainActivity activity = context.get();
    if (activity != null && !activity.isFinishing()) {

        activity.setView(userResp);
    }
}`enter code here

MainActivity.java
中的第53行是什么我不明白。。我在onPostExecute中设置了用户变量。。。这意味着所有异步进程都已完成。。。那么用户[]不能为空..好的,现在。。。AsyncTask在onCreate以外的其他线程中运行,onCreate继续运行,然后失败。。。谢谢大家…但AsyncTask独立于您的活动运行。调用
myTask.execute
后,您的活动不会等待它完成,它会立即转到下一行-因此此时,用户为空。编辑:你明白了:)是的。。。我现在明白了。。。异步的概念正在消耗我。
name.setText(this.users[0].getName());
        city.setText(this.users[0].getCity().getName());
public void setView(User[] users){

    name.setText(users[0].getName());
    city.setText(users[0].getCity().getName());
    country.setText(users[0].getCity().getCountry().getI18n_key());
}
protected void onPostExecute(Boolean result) {

    MainActivity activity = context.get();
    if (activity != null && !activity.isFinishing()) {

        activity.setView(userResp);
    }
}`enter code here