进度对话框不显示在屏幕上
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 的更多信息,您的代码中有很多错误
不要手动调用 doInBackground()
。
dc.doInBackground(totalMsg);
// 错误
DisplayMsg() 调用了几次,每次都会创建一个 class DisplayMsgClass 的新实例
DisplayMsgClass dc = new DisplayMsgClass();
// 错误
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);
}
}
我根据亲爱的 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 的更多信息,您的代码中有很多错误
不要手动调用
doInBackground()
。dc.doInBackground(totalMsg);
// 错误DisplayMsg() 调用了几次,每次都会创建一个 class DisplayMsgClass 的新实例
DisplayMsgClass dc = new DisplayMsgClass();
// 错误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);
}
}