静态异步任务Android错误
我是Android开发的新手,我正在学习一些东西,现在,我在静态AsynTask类中遇到了这个错误。。。但是我不理解你的问题。有人能帮我吗?。先谢谢你静态异步任务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
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