【问题标题】:Cannot change global variable无法更改全局变量
【发布时间】:2018-08-17 08:49:18
【问题描述】:

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

【问题讨论】:

  • 我觉得行号item1=response.body().string()不能叫,叫你提供全班?
  • 我添加了我的整个班级.. 我想你是对的,但我不知道为什么:(

标签: java android function variables global


【解决方案1】:

你不应该这样使用

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

} }

【讨论】:

  • 问题已解决,如您所说,将包括 onitemclicklistener 在内的整个内容移到 getItemFromServer 中,非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多