进度对话框不显示在屏幕上

Progress Dialog not show on screen

我根据亲爱的 Mayank 的回答编辑了我的代码,但它没有显示在方法开始之前在 displayMsg() 方法中作为输入发送的任何消息。我应该说 MethodTest() 是通过 nfc 和方法 onNewIntent 启动的(意向意向)

@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>

您看到 onProgressUpdate(Progress...) 在 if(...) 末尾调用的原因是因为 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...) 发生在 UI 线程 上,因此 UI 可以反映进度变化。通过向 UI 线程上的处理程序发送消息,可以将进度信息从工作线程同步到 UI 线程,而不会阻塞任何一个线程。

在 xml 布局中创建进度条并将其可见性设置为默认消失并创建示例代码

// 异步任务 .

    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);
    }
}

试试下面的代码

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

希望有用

:)GlbMP

请记住,AsyncTasks 最好用于短时间操作(最多几秒钟)。

尝试了解有关 AsyncTask 的更多信息,您的代码中有很多错误

  1. 不要手动调用 doInBackground()

    dc.doInBackground(totalMsg); // 错误

  2. DisplayMsg() 调用了几次,每次都会创建一个 class DisplayMsgClass 的新实例

    DisplayMsgClass dc = new DisplayMsgClass(); // 错误

  3. onPreExecute()
    textView.setText("Hello !!!"); // 空指针异常。 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);
    }
}