2016-03-09 2 views
3

Моя проблема заключается в том, что, когда я нажимаю кнопку «Click» для вызова моего API, он должен показывать мой progressBar (spinner), пока я звоню API. Вместо того, чтобы мое приложение сублимационной меньше, чем второй, а затем, когда это делается вызовом он показывает мою загрузку вертушку в течение короткого времени (это просто вспышка)ProgressBar Spinner для Async Задача не работает

Вот мой код

private ProgressBar spinner; 
public View onCreateView(...) 
{ 
    spinner = (ProgressBar) view.findViewById(R.id.progressBar1); 
    spinner.setVisibility(View.GONE); 
    ... 
} 



private class MyTask extends AsyncTask<String, Void, Void> { 

    String pageContent = ""; 
    DataOutputStream wr; 


    @Override 
    protected void onPreExecute() { 
     spinner.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public Void doInBackground(String... params) { 

     requestResult.setSuccess(false); 
     HttpURLConnection connection; 

     try { 
      String url = "myURL"; 

      //I only call my Api here. I delete rest so this won't bother you 

      requestResult.setSuccess(true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     JsonParser parser = new JsonParser(); 
     //Same here i delete nonimportant 

     MyResponse = new Gson().fromJson(jsonContent, MyResponse.class); 
     done(); 
     spinner.setVisibility(View.GONE); 
    } 

} 

Я пробовал hounder разные вещи, которые он всегда замирает на секунду, а затем моя флешка загрузки и мой контент из API.

Помогите мне с этим, пожалуйста?

Мой XML-файл

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scroll_view_send" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <RelativeLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:minWidth="25px" 
     android:minHeight="25px"> 
     <ProgressBar 
      android:id="@+id/progressBar1" 
      style="?android:attr/progressBarStyleLarge" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_below="@id/buttonSend" 
      android:visibility="gone"/> 
    </RelativeLayout> 
</ScrollView> 
+0

Там не хватает кода, чтобы увидеть детали, но если вы хотите обновить кок, что вам нужно сделать это в на onProgressUpdate API, как это работает в потоке пользовательского интерфейса. Также убедитесь, что вы не используете переменные в doInBackground и других методах, вместо этого используйте аргументы для передачи значений. – Francesc

+0

вы сделали свой тест в эмуляторе? –

+0

Другой код просто вызывает API ничего другого, или я ошибаюсь? onProgressUpdate не это, чтобы увидеть прогресс? Мне просто нужен прядильщик, который превращается в бесконечность. Мне просто нужно запустить этот счетчик и остановить его. Да, я использую аргументы для передачи моих значений. Я обращаюсь к ним как params [0], ... – Rok

ответ

1

Пожалуйста, попробуйте этот рабочий образец, передать spinner на ваш MyTask так:

private class MyTask extends AsyncTask<String, Void, Void> { 

    String pageContent = ""; 
    DataOutputStream wr; 

    private final ProgressBar progress; 

    public MyTask(final ProgressBar progress) { 
     this.progress = progress; 
    } 


    @Override 
    protected void onPreExecute() { 
     progress.setVisibility(View.VISIBLE); 
    } 

    ... 

    @Override 
    protected void onPostExecute(Void result) { 
     JsonParser parser = new JsonParser(); 
     //Same here i delete nonimportant 

     MyResponse = new Gson().fromJson(jsonContent, MyResponse.class); 
     done(); 
     progress.setVisibility(View.GONE); 
    } 
} 

Затем вызовите new MyTask(progress).execute();

EDIT: В вашем вопросе вы ссылаетесь на то, что ваш телефон замерзает при вызове MyTask ... Пожалуйста, проверьте этот шаг, чтобы избежать замораживания ваш пользовательский интерфейс в AsyncTask:

  1. Не называйте MyTask с использованием новых MyTask().get()
  2. Попробуйте перейти в doInBackground эту часть MyResponse = new Gson().fromJson(jsonContent, MyResponse.class); done(); это может быть дорого.

Надеюсь, что это поможет!

+0

. Я очень ценю вашу помощь, но это все еще не работает, как и раньше. Что такое с переменной parent и textview? Я получаю «переменная не может быть инициализирована» – Rok

+0

Я удалил неиспользуемую переменную, где вы получаете «переменная не может быть инициализирована»? –

+0

Я тоже это делал раньше. Это похоже на то, что этот код пропускается в onPreExecute и выполняется в onPostExecute. Это всегда то же самое, независимо от того, что я делаю. – Rok

2

Попробуйте приведенный ниже фрагмент. Он не требует, чтобы в файле макета был объявлен счетчик.

AsyncTask<String, String, String> asyncObject = 
new AsyncTask<String, String, String>() { 
    ProgressDialog progDailog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progDailog = 
       new ProgressDialog(Activity.this); 
     progDailog.setMessage("Loading"); 
     progDailog.setCancelable(false); 
     progDailog.show(); 
    } 

    @Override 
    protected String doInBackground(String... urls) { 
     //Do background stuff here 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     progDailog.cancel(); 
     //Do post background stuff here. 
    } 
}; 
asyncObject.execute(null, null, null); 
+0

Спасибо за помощь, но она такая же, как раньше. Это похоже на то, что этот код пропускается и выполняется в onPostExecute – Rok

+0

Вместо того, чтобы устанавливать видимость счетчика, попробуйте показать и отменить функции. –