У меня есть приложение, которое выполняет вызовы API, когда пользователь входит в систему, у меня есть два класса, один из которых передает API-интерфейс, а другой - извлекает из него.У меня также есть asyncTask
в моей активности входа в систему, которая обрабатывает сетевое соединение.Когда начинается сетевое соединение, у меня есть представление switcher
, чтобы переключить представление на загрузчик прогресса, и textview
, текстовое представление используется для отображения таких вещей, как «Подключение», «Загрузка данных» и т. Д.
Проблема в том, что мои методы API Push и Pull хранятся в разных классах, и LogIn AsyncTask
просто вызывает их, все работает, за исключением обновления TextView
, чтобы позволить пользователюзнать прогресс.
В операции входа в систему у меня есть этот метод, который изменяет информацию textview
на любой номер, который ему передается.
public void updateProgress(int i) {
switch (i) {
case 0:
loadInfo.setText(R.string.log_in_thread_Connecting);
break;
case 1:
loadInfo.setText(R.string.log_in_thread_Connected);
break;
case 2:
loadInfo.setText(R.string.log_in_Thread_Sending_Data);
break;
case 3:
loadInfo.setText(R.string.log_in_thread_Response);
break;
case 4:
loadInfo.setText(R.string.log_in_web_connecting);
break;
case 5:
loadInfo.setText(R.string.log_in_web_connected);
break;
case 6:
loadInfo.setText(R.string.log_in_web_user_data_download);
break;
case 7:
loadInfo.setText(R.string.log_in_web_user_data_downloaded);
break;
case 8:
loadInfo.setText(R.string.log_in_web_device_data_upload);
break;
}
}
Это работает, если я вызываю его изAsyncTask
из входа в систему, но не из классов API.
Я нашел метод с именем .runOnUiThread, поэтому я попытался реализовать это.
private void publishProgress(final int i){
logInActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
logInActivity.updateProgress(i);
Log.d("UI THREAD","HIT");
}
});
}
Это то, что я придумал, но, похоже, ничего не происходит, я даже не вижу запись в журнале.
У меня также была ошибка при реализации этого, но она была устранена, когда я добавил Looper.prepare();
в логин AsyncTask
AsyncTask
private class RegistrationWeb extends AsyncTask<Void,Void,Void>{
private static final String tag = "API_LogIn";
private String APIKey = null
@Override
protected void onPreExecute() {
super.onPreExecute();
viewFlipper.showNext();
APIKey = getAPIKey();
}
@Override
protected Void doInBackground(Void... voids) {
try{
Looper.prepare();
GetAPIData get = new GetAPIData();
URL url = new URL(API_Register_User+APIKey);
String response = get.GetData(url);
JSONArray jsonArray = new JSONArray(response);
JSONObject jsonObject = jsonArray.getJSONObject(0);
//If the user is accepted
if(jsonObject.getString("_Code").equals("0")){
PublishProgress(8);
PostAPIData post = new PostAPIData();
url = new URL(API_Register_Device);
response = post.PostData(url);
jsonArray = new JSONArray(response);
jsonObject = jsonArray.getJSONObject(0);
} else if(jsonObject.getString("_Code").equals("2")){
}
} catch (MalformedURLException e) {
Log.e(tag,e.toString());
} catch (JSONException e) {
Log.e(tag,e.toString());
} catch (IOException e) {
Log.e(tag,e.toString());
}
return null;
}
private void PublishProgress(final int i){
runOnUiThread(new Runnable() {
@Override
public void run() {
updateProgress(i);
}
});
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}