Java 无法更改全局变量

Java 无法更改全局变量,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

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<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");
    }
});