首页 > 解决方案 > 无法更改全局变量

问题描述

item1 是同一类中的全局变量,但即使使用此函数后我也无法更改它。

如果我使用 item1,它会说 item1 为空

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


}

这是我的全班。我正在获取 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");
        }
    });
}
}

标签: javaandroidfunctionvariablesglobal

解决方案


你不应该使用这种方式

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

因为getItemFromServer调用 api 的方法正在另一个线程上工作,这意味着当您调用

String[] items={item1, item2, item3};

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

} }


推荐阅读