Как обновить данные TextView из Java класса?

463
02 января 2017, 22:00

Есть класс MainActivity реализует интерфейс UpdateView

public interface UpdateView {
    void update(String name, String lastname);
}
public class MainActivity extends AppCompatActivity implements UpdateView {
@BindView(R2.id.first_name) TextView firstName;
@BindView(R.id.last_name) TextView lastName;
private User userInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    User userInfo = new User();
    userInfo.init(getApplicationContext());
    try {
        Log.d("User info ", userInfo.getFirstName());
    }catch (Exception e){
        e.printStackTrace();
    }
}
@Override
public void update(String name, String lastname) {
    firstName.setText(name);
}

}

Класс User в которым данные берется из API. Для получения данных из сети использую библиотеку okHttp (асинхронный вызов).

public class User {
private String firstName;
private String lastName;
private UpdateView updateView;

public  void init(Context context){
    getDataFromAPI();
}
private void getDataFromAPI(){
    HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.vk.com/method/users.get").newBuilder();
    urlBuilder.addQueryParameter("user_ids", "210700286");
    urlBuilder.addQueryParameter( "fields", "bdate");
    urlBuilder.addQueryParameter("v", "5.60");
    String url = urlBuilder.build().toString();
    OkHttpClient client  = new OkHttpClient();
    Request request = new Request.Builder().url(url).build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //Log.d("Response", response.body().string());
            parseUserInfo(response.body().string());
            updateView = new MainActivity();
            updateView.update(firstName, lastName);
        }
    });
}
private void parseUserInfo(String string) {
    try {
        JSONObject jsonObj = new JSONObject(string);
        JSONArray response = jsonObj.getJSONArray("response");
        JSONObject userObject = response.getJSONObject(0);
        String name = userObject.getString("first_name");
        String lastName = userObject.getString("last_name");
        //Log.d("2", name + " " + lastName);
        this.firstName = name;
        this.lastName = lastName;
    } catch (JSONException e) {
        e.printStackTrace();
    }
}}

Получаю рантайме

FATAL EXCEPTION: OkHttp Dispatcher
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Как обновить TextView когда данные успешно получены (onResponse())?

Если запрос данных из API перенесу из User в MainActivity и внем запущу

public void onResponse(Call call, Response response) throws IOException {
        //Log.d("Response", response.body().string());
        parseUserInfo(response.body().string());
        runOnUiThread(new Runnable() {
        @Override
        public void run() {
            firstName.setText(....);
        }
    });
    }

работает.

Answer 1

Activity может создавать только операционная система. В вашем коде new MainActivity() принципиально неверно. А второй вариант, когда запрос происходит из уже созданной MainActiivty, верен.

READ ALSO
Как добавить Audio звонок?

Как добавить Audio звонок?

Всем приветС Новым годом вас

395
Свой секундомер в игру,способы и имеющиеся в java методы

Свой секундомер в игру,способы и имеющиеся в java методы

Захотелось в игру сделать секундомерЯ представляю это так: системное время идет и я в соответствии с ним выставляю изображения цифр

391
JTable записать данные ИЗ таблицы в массив Java

JTable записать данные ИЗ таблицы в массив Java

Всем доброе время суток! Как я знаю, при создании таблицы есть возможность перегрузкой отправить двумерный массив данных и одномерный с названиями...

547
Рейтинг игроков на Google Play

Рейтинг игроков на Google Play

Вобщем, есть игра типа "Викторина" и естественно нужно было подключить рейтинг, подключил рейтинг Google Play, так вот незадача в том, что рейтинг...

362