2016-11-08 3 views
4

Я отредактировал свой код в соответствии с уважаемым Mayank'answer, но он не отображает сообщение, которое отправляется как входное значение в методе displayMsg() до того, как метод начнется. Я должен сказать, что метод MethodTest() запускается с помощью nfc и в методе onNewIntent (Intent умысел)Прогресс Диалог не отображается на экране

@Override 
protected void onNewIntent(Intent intent) { 
    MethodTest(); 
    .............. 

} 

public void MethodTest() { 
    DisplayMsg("method 1 is running"); 
    Method1(); 

    DisplayMsg("method 2 is running"); 
    Method2(); 

    DisplayMsg("method 3 is running"); 
    Method3(); 

} 

private int DisplayMsg(String msg) { 
    totalMsg += msg; 
    DisplayMsgClass dc = new DisplayMsgClass(); 
    dc.doInBackground(totalMsg); 
} 

private class DisplayMsgClass extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     textView.setText("Hello !!!"); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     progressBar.setVisibility(View.VISIBLE); 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 

    } 

    @Override 
    protected String doInBackground(String... Messages) { 


     return Messages[0]; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     progressBar.setVisibility(View.INVISIBLE); 

     textView.setText(result); 
    } 
} 

в моем макете:

<LinearLayout> 
<ProgressBar 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:visibility="gone" 
    android:id="@+id/progressBar1" 
    /> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/textv1" 
    android:hint="AppletPass" 
    android:gravity="center"/> 
</LinearLayout> 
+3

Что вы подразумеваете под 'int value = obj.doInBackground (msg);'? См. [AsyncTask] (https://developer.android.com/reference/android/os/AsyncTask.html) для правильной реализации AsyncTask. –

+0

Это не важно. Я поставил его для проверки выполнения DisplayMsg и создания времени для может видеть диалог – Fatemeh

+5

Хорошо, используйте 'obj.execute (" "); вместо' int value = obj.doInBackground (msg); 'и проверьте' ProgressDialog' показывает или нет –

ответ

3

Помните, что AsyncTasks в идеале должен быть использованы для коротких операций (несколько секунд, в лучшем случае.)

Постарайтесь узнать больше о AsyncTask, и в вашем так много ошибок. код

  1. Не звоните doInBackground() вручную.

    dc.doInBackground(totalMsg); // Ошибка

  2. DisplayMsg() называется несколько раз, каждый раз, когда новый экземпляр класса DisplayMsgClass создан

    DisplayMsgClass dc = new DisplayMsgClass(); // Ошибка

  3. onPreExecute()
    textView.setText("Hello !!!"); // NullPointerException. textView.setText() вызывается без его инициализации.

Внимание

Не звони больше, чем один AsyncTask.execute() на одном входом в инстанс.
Для например:

DisplayMsgClass displayMsgClass = new DisplayMsgClass(); 
displayMsgClass.execute(); 
displayMsgClass.execute(); //Error, IllegalStateException 

покажет вам основные демо, основанный на вас реализации, и вы можете просто изменить его в соответствии с вашим собственным способом.

public void MethodTest() { 

    // execute task 
    new DisplayMsgClass().execute("Download now"); 
} 

/* 
public void MethodTest() { 
    DisplayMsg("method 1 is running"); 
    Method1(); 

    DisplayMsg("method 2 is running"); 
    Method2(); 

    DisplayMsg("method 3 is running"); 
    Method3(); 

} 

private int DisplayMsg(String msg) { 
    totalMsg += msg; 
    DisplayMsgClass dc = new DisplayMsgClass(); 
    dc.doInBackground(totalMsg); 
} 
*/ 

private class DisplayMsgClass extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     // retrieve the widgets 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     textView = (TextView) findViewById(R.id.textv1); 


     textView.setText("Download initialized"); 
     progressBar.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected String doInBackground(String... Messages) { 

     // read commands 
     String command = Messages[0]; 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return "Download completed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 

     //invoked on the UI thread after the background computation finishes 
     progressBar.setVisibility(View.INVISIBLE); 
     textView.setText(result); 
    } 
} 
2

причина, почему вы видите onProgressUpdate(Progress...) названием в конце, если (...) потому, что publishProgress(Progress... values) посылает сообщение к внутреннему обработчику, этот внутренний обработчик позже обрабатывает сообщение для обновления прогресса. Другими словами, publishProgress(Progress... values) не синхронно называют onProgressUpdate(Progress...) См реализации здесь: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L649

Это необходимо потому, что publishProgress(Progress... values), как ожидается, будет называться из doInBackground(Params...), который находится на рабочий поток в течение AsyncTask, в то время как onProgressUpdate(Progress...) происходит на Пользовательский интерфейс, поэтому пользовательский интерфейс может отражать изменение хода. Отправляя сообщение обработчику в потоке пользовательского интерфейса, информация о ходе работы может быть синхронизирована из рабочего потока в поток пользовательского интерфейса без блокировки нити.

+0

Спасибо, что ответили мне. wxcuse me Я не понимаю. Должен ли я вызвать onProgressUpdate (Прогресс ...) в doInBackground (Params ...) вместо publishProgress (Прогресс ... значения)? вы можете дать мне изменения кода? – Fatemeh

+0

Непонятно, почему вы решили использовать AsyncTask: AsyncTask предназначен для дорогостоящих фоновых задач, выполняемых на рабочем потоке, чтобы освободить поток пользовательского интерфейса от выполнения трудоемких задач, которые потенциально могут привести к отказу кадров. Является ли 'MethodTest()' предполагаемым для запуска в потоке пользовательского интерфейса или фоновом потоке? –

+1

Я использую nfc. Он вызывает новый метод намерения, и в этом методе я вызываю метод test. Я не мог найти решение и использовать асинхронную задачу. Если у вас есть решение проблемы, пожалуйста, дайте мне. Я хочу показать сообщение до вызова метода – Fatemeh

0

создают прогресс бар в макете XML и установить его видимость пошли по умолчанию и создать код, как образец

// AsyncTask.

private class DownloadWebPageTask extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     //textView.setText("Hello !!!"); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     progressBar.setVisibility(View.VISIBLE); 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 

    } 

    @Override 
    protected String doInBackground(String... urls) { 
     String response = ""; 
     for (String url : urls) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(new InputStreamReader(
         content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     progressBar.setVisibility(View.INVISIBLE); 
     textView.setText(result); 
    } 
} 
+0

Спасибо, что ответили мне. Извините, что такое textview?почему он используется? Я редактировал свой код, записывая ваш пост. но не показывать какое-либо сообщение снова – Fatemeh

+0

его пример, так что в основном в этом примере мы получаем данные с сервера (в json) и показываем его в Textview. вы должны изменить его согласно вашему требованию –

+0

Я отредактировал мой код. Я разместил текстовое представление, и я снова поставил свой отредактированный код. после вызова dc.doInBackground (totalMsg); в методе displaymsg(). только doInBackground вызывается и возвращается, и ничего не отображается в текстовом представлении. не следует ли я называть метод publishProgress в doInBackground? – Fatemeh

1

Try ниже кода

private int DisplayMsg(String msg) { 
    totalMsg += msg; 
    DisplayMsgClass dc = new DisplayMsgClass(); 
    dc.runner.execute(totalMsg); 
} 

Надеются, что он будет работать

:) GlbMP

+0

Извините, но бегун в dc не определен. Я написал dc.onPostExecute (totalMsg); но когда textv.setText (результат); выполняется в методе onPostExecute (результат String) содержимое текстового поля не изменяется :(зачем нужен индикатор выполнения? Что он делает? – Fatemeh

Смежные вопросы