不能改变全局变量
Cannot change global variable
item1 是同一个全局变量 class,
但是即使使用了这个功能我也不能改变它。
如果我使用 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");
}
});
}
这是我的全部class。
我收到 java.lang.NullPointerException: println 需要一条消息
我猜它来自 Log.i("msg", item1)
/********整个class*********/
包 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");
}
});
}
}
item1 是同一个全局变量 class, 但是即使使用了这个功能我也不能改变它。
如果我使用 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");
}
});
}
这是我的全部class。 我收到 java.lang.NullPointerException: println 需要一条消息 我猜它来自 Log.i("msg", item1)
/********整个class*********/
包 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");
}
});
} }