Вызовите метод non-stati c в методе Stati c JAVA - PullRequest
0 голосов
/ 07 февраля 2020

РЕДАКТИРОВАНИЕ:

Реальная цель этого состоит в том, чтобы иметь в классе одно действие, которое извлекает данные и передает их в действие.

Проблема в том, что у меня выпадающее меню. Когда я щелкаю по пункту меню, он меняет мой URL, но он не загружает и не извлекает мои данные в действие, но когда я нажимаю снова, он работает, но с параметрами, выбранными непосредственно перед этим, и если я нажал снова, он все еще работает, но все еще с предыдущие элементы выбраны.

Мой «учитель» сказал, что я должен вызвать build в свой метод обратного вызова. Но это не работает вообще. И я до сих пор не нашел никакого решения: /.

Как вы и рекомендовали, я изменил все для нестатического c метода

Я подумал, почему бы не сохранить историю выпадающего списка, сравнить текущее значение с сохраненным значением и, если оно отличается, это означает, что оно было изменено, поэтому перезагрузите приложение, чтобы произвести новую выборку и отобразить новые данные.

Но я получил:

Вот мой весь код

PhotosActivity

public class PhotosActivity extends AppCompatActivity {

    // Local variable
    private OkHttpClient httpClient;
    private ImageButton home_btn;
    private ImageButton favorites_btn;
    private ImageButton search_btn;
    private ImageButton profil_btn;
    // Constante variable
    private static final String TAG = "PhotoActivity";
    private static final String clientId = "bb0c749c6403fd2";

    // Private shared variable
    private static  List<Photo> mPhotos;
    private static JSONArray mItems;
    private static String mAccessToken;
    private static String userID;
    static Activity activity;

    // Shared variable
    private static String selectedItem;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_photos);
        this.home_btn = findViewById(R.id.home_button);
        this.favorites_btn = findViewById(R.id.favorites_button);
        this.search_btn = findViewById(R.id.search_button);
        this.profil_btn = findViewById(R.id.profil_button);

        final HttpHandler httpHandler = new HttpHandler();
        httpHandler.fetchData();
        build();

        activity = this;

        Spinner spinner=(Spinner)findViewById(R.id.spinner);
        String[] filters=getResources().getStringArray(R.array.filters);
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.spinner,R.id.text, filters);
        spinner.setAdapter(adapter);


        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                selectedItem = parent.getItemAtPosition(position).toString();
//                httpHandler.fetchData();
//                build();
            }
            public void onNothingSelected(AdapterView<?> parent)
            {
                Log.d("TAG", "Error");
            }
        });

        home_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent next_activity = new Intent(getApplicationContext(), PhotosActivity.class);
                finish();
                startActivity(next_activity);
            }
        });
        favorites_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent next_activity = new Intent(getApplicationContext(), FavoriteActivity.class);
                finish();

                startActivity(next_activity);
            }
        });
        search_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent next_activity = new Intent(getApplicationContext(), SearchActivity.class);
                finish();
                startActivity(next_activity);
            }
        });
        profil_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent next_activity = new Intent(getApplicationContext(), ProfileActivity.class);
                finish();
                startActivity(next_activity);
            }
        });
    }

    public void Filters() {
        String hSection;
        String hSort;
        String hShowV;

        hSection = HttpHandler.section ;
        hSort = HttpHandler.sort;
        hShowV = HttpHandler.showV;
        Intent next_activity = new Intent(getApplicationContext(), FavoriteActivity.class);

        if(selectedItem != null) {
            if (selectedItem.equals("Most Viral")) {
                HttpHandler.sort = "viral/";
                HttpHandler.section = "hot/";
                if ( (!HttpHandler.sort.equals(hSort))  || (!HttpHandler.section.equals(hSection))) {
                    Log.d("TAG", "most: "+HttpHandler.section);
                    Log.d("TAG", "H most: "+hSection);
//                    activity.recreate();
//                    onRestart();
                    finish();
                    startActivity(next_activity);
                }
            } else if (selectedItem.equals("Newest")) {
                HttpHandler.section = "top/";
                HttpHandler.sort = "time/";
                if ( (!HttpHandler.sort.equals(hSort))  || (!HttpHandler.section.equals(hSection))) {
                    Log.d("TAG", "new: "+HttpHandler.section);
                    Log.d("TAG", "H new: "+hSection);
                    finish();
                    startActivity(next_activity);
//                    activity.recreate();
//                    onRestart();
                }
            } else if (selectedItem.equals("Rising")) {
                HttpHandler.section = "user/";
                HttpHandler.sort = "rising/";
                HttpHandler.showV = "?showViral=false";
                if ( (!HttpHandler.sort.equals(hSort))  || (!HttpHandler.section.equals(hSection))) {
                    Log.d("TAG", "rising: "+HttpHandler.section);
                    Log.d("TAG", "H rising: "+hSection);
//                    onRestart();
//                    activity.recreate();
                    finish();
                    startActivity(next_activity);
                }
            } else {
                Log.d(TAG, "Might be a problem");
            }
        } else {
                activity.recreate();
        }
    }
    public void build () {
        try {
            for(int i = 0; i < mItems.length(); i++) {
                JSONObject item = mItems.getJSONObject(i);
                Photo photo = new Photo();
                if(item.getBoolean("is_album")) {
                    photo.id = item.getString("cover");
                } else {
                    photo.id = item.getString("id");
                }
                photo.title = item.getString("title");
                mPhotos.add(photo);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        render(mPhotos);
                    }
                });
            }

        } catch (Exception e) {
            Log.e("JSONerr" , "Something went wrong.");
        }
    }

    private static class PhotoVH extends RecyclerView.ViewHolder {
        ImageView photo;
        TextView title;

        public PhotoVH(View itemView) {
            super(itemView);
        }
    }

    private void render(final List<Photo> photos) {
        RecyclerView rv = (RecyclerView)findViewById(R.id.rv_of_photos);
        rv.setLayoutManager(new LinearLayoutManager(this));

        RecyclerView.Adapter<PhotoVH> adapter = new RecyclerView.Adapter<PhotoVH>() {
            @NonNull
            @Override
            public PhotoVH onCreateViewHolder(ViewGroup parent, int viewType) {
                PhotoVH vh = new PhotoVH(getLayoutInflater().inflate(R.layout.item, null));
                vh.photo = (ImageView) vh.itemView.findViewById(R.id.photo);
                vh.title = (TextView) vh.itemView.findViewById(R.id.title);
                return vh;
            }

            @Override
            public void onBindViewHolder(PhotoVH holder, int position) {
                Picasso.with(PhotosActivity.this).load("https://i.imgur.com/" +
                        photos.get(position).id + ".jpg").into(holder.photo);
                holder.title.setText(photos.get(position).title);
            }

            @Override
            public int getItemCount() {
                return photos.size();
            }
        };

        rv.setAdapter(adapter);
    }

    public static void getUserID(String UserID) {
        Log.d("TAG", UserID);
        userID = UserID;
    }

    public void callBackPhoto( List<Photo> photos, JSONArray items)
    {
         mPhotos = photos;
         mItems = items;
//         build();
    }

}

HttpHandler

public class HttpHandler {
    private static final String TAG = "HttpHandler";
    private static String clientId = "bb0c749c6403fd2";
    private static OkHttpClient httpClient;
    private static String mAccessToken;

    // URL BUILDER VARIABLES
    public static String section = "hot/";
    public static String sort = "viral/";
    public static String page;
    public static String showV;
    public static String mUrl;

    public void fetchData() {
        httpClient = new OkHttpClient.Builder().build();
        photosActivity.Filters();
        mUrl = "https://api.imgur.com/3/gallery/" + section + sort;
//        Log.d("TAG", "Sort: " + sort + ": URl is" + mUrl);
        Request request = new Request.Builder()
                .url(mUrl + "0.json" + showV)
                .addHeader("Authorization", "Client-ID " + clientId)
                .header("User-Agent", "epicture")
                .build();
        httpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e(TAG, "An error has occurred " + e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    JSONObject data = new JSONObject(response.body().string());
                    JSONArray items = data.getJSONArray("data");
                    final List<Photo> photos = new ArrayList<Photo>();
                    photosActivity.callBackPhoto(photos, items);
                } catch (Exception e) {
                    Log.e("JSONerr", "Something went wrong.");
                }
            }
        });
    }

    public static void getLoginData(String accessToken) {
        mAccessToken = accessToken;
    }
}

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Не имеет смысла объявлять callBackPhoto как static метод. Если вы случайно указали ключевое слово static в его объявлении, просто удалите его, чтобы решить вашу проблему, т.е. замените

public static void callBackPhoto( List<Photo> photos, JSONArray items)

на

public void callBackPhoto( List<Photo> photos, JSONArray items)

Обратите внимание, что нет способа вызвать нестати c метод от static напрямую (т.е. без вызова его для объекта / экземпляра). Таким образом, если по какой-либо причине вы не можете удалить ключевое слово static из объявления callBackPhoto, у вас останется только две опции:

  1. Объявите build тоже как static
  2. Вызовите build для объекта / экземпляра, например, new PhotosActivity().build()

    Хотя любой из этих двух вариантов решит вашу проблему, я не думаю, что именно так вы намереваетесь Создай свой класс.

0 голосов
/ 07 февраля 2020

Стати c

Методы Стати c живы все время. Они живут из класса загружен. Им не нужны предметы для жизни. Я думаю о них как о , а не , действительно принадлежащих классу, но класс - просто хороший способ организовать эти методы (то же самое для переменных). Методы могут быть помещены в любое другое определение класса, и оно все равно будет работать. Но организация их по классам, в которых они будут использоваться, упрощает предотвращение доступа из других частей программы, таких как другие объекты или другие методы stati c. Они называются методы класса или переменные класса .

Экземпляр

Нестатистический c "материал" не существует, если не существует объект. Вот почему вы не можете вызывать ниже methodOne или methodTwo из методов stati c. Вы должны сначала создать объект. Они называются методы экземпляра или переменные экземпляра , потому что вам нужен экземпляр объекта для их вызова.

Ошибка

error: non-static method <methodname> cannot be referenced from a static context в основном означает «Там нет объекта»

Пример

public class StackOverflowTest {
  public static void main(String[] args) {  // this is just another static method
//    methodOne();                            // error. There's no object

    StackOverflowTest test = new StackOverflowTest(); 
    test.methodOne();                       // method called on object.
  }

  // methods live outside objects
  static void staticMethodOne() {
    System.out.println("staticMethodOne");
    staticMethodTwo();                      // no object required.
  }
  static void staticMethodTwo() { 
    System.out.println("staticMethodTwo");
//    methodTwo();                            // error. There's no object
  }

  // methods that only live inside objects
  void methodOne() {                        // method can only be invoked if there's an object.
    System.out.println("methodOne");
    methodTwo();                            // no problem. Already inside the object.
  }
  void methodTwo() {
    System.out.println("methodTwo");
    staticMethodTwo();                      // no problem. Objects can access static methods.
  }
}

Ваш кейс

Так что вы либо должны создать PhotosActivity объект внутри вашего build(), либо у вас есть сделать callBackPhoto static метод. Я не вижу, что делает ваш render, но это тот же принцип.

0 голосов
/ 07 февраля 2020

В java метод stati c принадлежит КАЖДОМУ объекту класса, который его определяет. Таким образом, вы можете вызывать его из родительского класса, не создавая объект, например, так:

ParentClass.myMethod;

Однако это не тот случай, когда используются методы экземпляра (non-stati c). Чтобы вызвать метод такого типа, вам нужно определить его в классе, создать объект из этого класса, а затем вызвать его из этого объекта, например:

//inside ParentClass definition
public void myMethod(){bla bla;}
//In some other class
ParentClass obj = new ParentClass;
obj.myMethod;

Предположим, у вас есть код вызов статического члена класса c без создания экземпляра этого класса. Если бы этот метод содержал нестатический c метод, в памяти не было бы объекта, чтобы вызвать его. Вот почему это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...