Java 无法更改全局变量
item1是同一类中的全局变量, 但即使使用此函数,我也无法更改它 如果我使用item1,它会说item1为nullJava 无法更改全局变量,java,android,function,variables,global,Java,Android,Function,Variables,Global,item1是同一类中的全局变量, 但即使使用此函数,我也无法更改它 如果我使用item1,它会说item1为null public void getItemFromServer(String id){ retrofit=new Retrofit.Builder().baseUrl(ApiService.API_URL).build(); apiService=retrofit.create(ApiService.class); //GET Call<Res
public void getItemFromServer(String id){
retrofit=new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
apiService=retrofit.create(ApiService.class);
//GET
Call<ResponseBody> comment=apiService.getByID(id);
comment.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
item1=response.body().string();
try{Thread.sleep(2000);}catch(InterruptedException e){Log.i("sleep", "failed2");}
}catch (IOException e){
Log.i("Test2", "failed");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("Test", "get item from server failed");
}
});
}
public void getItemFromServer(字符串id){
改装=新建改装.Builder().baseUrl(ApiService.API_URL.build();
apiService=reformation.create(apiService.class);
//得到
callcomment=apiService.getByID(id);
enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
试一试{
item1=response.body().string();
试试{Thread.sleep(2000);}catch(InterruptedException e){Log.i(“sleep”,“failed2”);}
}捕获(IOE异常){
Log.i(“Test2”,“失败”);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.i(“测试”,“从服务器获取项目失败”);
}
});
}
这是我的全班同学。
我收到java.lang.NullPointerException:println需要一条消息
我猜它来自Log.I(“msg”,item1)
/********全班*********/
包com.example.kimsy.myapplication
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
Retrofit retrofit;
ApiService apiService;
String item1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Log.i("result", getItemFromServer("5"));
getItemFromServer("5");
Log.i("msg", item1);
String item2="item2";
String item3="item3";
String[] items={item1, item2, item3};
ListAdapter adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
ListView listView=(ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
listView.setOnItemClickListener(
new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
String item=String.valueOf(parent.getItemAtPosition(i));
Toast.makeText(MainActivity.this, item, Toast.LENGTH_LONG).show();
}
}
);
}
public void getItemFromServer(String id){
retrofit=new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
apiService=retrofit.create(ApiService.class);
//GET
Call<ResponseBody> comment=apiService.getByID(id);
comment.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
item1=response.body().string();
}catch (IOException e){
Log.i("Test2", "failed");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("Test", "get item from server failed");
}
});
}
}
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.util.Log;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.ListAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
导入java.io.IOException;
进口okhttp3.0响应电子书;
2.电话;;
2.回拨;
2.回应;;
进口改装2.改装;
公共类MainActivity扩展了AppCompatActivity{
改造;
蜜蜂服务;
字符串项1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Log.i(“结果”,getItemFromServer(“5”);
getItemFromServer(“5”);
Log.i(“msg”,第1项);
字符串item2=“item2”;
字符串item3=“item3”;
字符串[]items={item1,item2,item3};
ListAdapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,items);
ListView ListView=(ListView)findViewById(R.id.ListView);
setAdapter(适配器);
listView.setOnItemClickListener(
新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父项、视图、int i、long id){
String item=String.valueOf(parent.getItemAtPosition(i));
Toast.makeText(MainActivity.this,item,Toast.LENGTH_LONG.show();
}
}
);
}
public void getItemFromServer(字符串id){
改装=新建改装.Builder().baseUrl(ApiService.API_URL.build();
apiService=reformation.create(apiService.class);
//得到
callcomment=apiService.getByID(id);
enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
试一试{
item1=response.body().string();
}捕获(IOE异常){
Log.i(“Test2”,“失败”);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.i(“测试”,“从服务器获取项目失败”);
}
});
}
}
你不应该用这种方式
getItemFromServer("5");
Log.i("msg", item1);
String item2="item2";
String item3="item3";
String[] items={item1, item2, item3};
ListAdapter adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
ListView listView=(ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
item1
可能仍然null
所以,让我们用正确的方法来做:
public class MainActivity extends AppCompatActivity {
Retrofit retrofit;
ApiService apiService;
String item1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Log.i("result", getItemFromServer("5"));
Log.i("msg", item1);
String item2="item2";
String item3="item3";
ListView listView=(ListView)findViewById(R.id.listView);
listView.setOnItemClickListener(
new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
String item=String.valueOf(parent.getItemAtPosition(i));
Toast.makeText(MainActivity.this, item, Toast.LENGTH_LONG).show();
}
}
);
getItemFromServer("5");
}
public void getItemFromServer(String id){
retrofit=new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
apiService=retrofit.create(ApiService.class);
//GET
Call<ResponseBody> comment=apiService.getByID(id);
comment.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
item1=response.body().string();
String[] items={item1, item2, item3};
ListAdapter adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
}catch (IOException e){
Log.i("Test2", "failed");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("Test", "get item from server failed");
}
});
public类MainActivity扩展了AppCompatActivity{
改造;
蜜蜂服务;
字符串项1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Log.i(“结果”,getItemFromServer(“5”);
Log.i(“msg”,第1项);
字符串item2=“item2”;
字符串item3=“item3”;
ListView ListView=(ListView)findViewById(R.id.ListView);
listView.setOnItemClickListener(
新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父项、视图、int i、long id){
String item=String.valueOf(parent.getItemAtPosition(i));
Toast.makeText(MainActivity.this,item,Toast.LENGTH_LONG.show();
}
}
);
getItemFromServer(“5”);
}
public void getItemFromServer(字符串id){
改装=新建改装.Builder().baseUrl(ApiService.API_URL.build();
apiService=reformation.create(apiService.class);
//得到
callcomment=apiService.getByID(id);
enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
试一试{
item1=response.body().string();
字符串[]items={item1,item2,item3};
ListAdapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,items);
setAdapter(适配器);
}捕获(IOE异常){
Log.i(“Test2”,“失败”);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.i(“测试”,“从服务器获取项目失败”);
}
});
}
}我认为行代码
item1=response.body().string()
不能调用,调用你提供的整个类?我添加了我的整个类。。我想你是对的,但我不明白为什么:(问题已经解决了,按照你告诉我的,将包括onitemclicklistener在内的整个内容移动到getItemFromServer中,非常感谢!!!
public class MainActivity extends AppCompatActivity {
Retrofit retrofit;
ApiService apiService;
String item1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Log.i("result", getItemFromServer("5"));
Log.i("msg", item1);
String item2="item2";
String item3="item3";
ListView listView=(ListView)findViewById(R.id.listView);
listView.setOnItemClickListener(
new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
String item=String.valueOf(parent.getItemAtPosition(i));
Toast.makeText(MainActivity.this, item, Toast.LENGTH_LONG).show();
}
}
);
getItemFromServer("5");
}
public void getItemFromServer(String id){
retrofit=new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
apiService=retrofit.create(ApiService.class);
//GET
Call<ResponseBody> comment=apiService.getByID(id);
comment.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
item1=response.body().string();
String[] items={item1, item2, item3};
ListAdapter adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
}catch (IOException e){
Log.i("Test2", "failed");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("Test", "get item from server failed");
}
});