java - 无法更改全局变量
问题描述
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");
}
});
}
}
解决方案
你不应该使用这种方式
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");
}
});
} }
推荐阅读
- postgresql - LOGSTASH:如何设置 logstash 以获取所有查询的数据,而不仅仅是其中的一部分?
- windows - 如何更改 CMD 目录上的别名
- windows - MFC:在对话框 SetParent() 上冻结
- asp.net - 在视图中访问 localdb 数据
- sql - Postgresql get count of items based on the condition
- r - 尝试将数据导出到 excel,可以,但代码在每张纸上重复繁琐
- javascript - 打字稿错误 JSX 元素类型“视图”不是 JSX 元素的构造函数
- tcl - 处理未完成时从循环中获取值
- javascript - How to await user input with javascripts async/await syntax?
- python - Python: How to print all numbers except the multiples of 3