进度对话框不显示在屏幕上
我编辑我的代码,根据亲爱的Mayank'answer,但它不显示任何消息,在方法开始之前显示在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>
记住AsyncTasks应该理想地用于短操作(几秒钟之最。 )
尝试了解有关AsyncTask的更多信息,并且您的许多错误代码
-
请勿手动拨打
doInBackground()
。dc.doInBackground(totalMsg);
//错误 -
DisplayMsg()调用多次,类DisplayMsgClass的新实例创建
DisplayMsgClass dc = new DisplayMsgClass();
//错误 onPreExecute()
textView.setText("Hello !!!");
// NullPointerException异常各一次。在不初始化的情况下调用textView.setText()
。
注意
不要打电话超过一个AsyncTask.execute()
更上了一个相同的intance。
对于如:
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);
}
}
为什么你看到onProgressUpdate(Progress...)
称为在IF(...)是最终的原因是因为publishProgress(Progress... values)
发布消息到内部处理程序,这个内部处理程序稍后处理该消息更新进度。换句话说,publishProgress(Progress... values)
不同步调用onProgressUpdate(Progress...)
SEE实施这里: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线程,而不会阻塞任何线程。
谢谢你回答我。 wxcuse我我不明白。我应该在doInBackground(Params ...)中调用onProgressUpdate(Progress ...),而不是publishProgress(Progress ... values)?你可以给我代码更改吗? – Fatemeh
我不清楚为什么你选择使用AsyncTask:AsyncTask是设计用于在工作线程上运行的昂贵的后台任务,以使UI线程免于执行可能导致丢帧的耗时的任务。 MethodTest()是否应该在UI线程或后台线程上运行? –
我使用nfc。它调用新的意图方法,并在此方法中调用方法测试。我找不到任何解决方案并使用异步任务。如果你有我的问题的解决方案,请给我。我只想在调用方法之前显示消息 – Fatemeh
创建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);
}
}
谢谢你回答我。不好意思,什么是textview?为什么使用?我编辑了我的代码,包括您的帖子。但不会再显示任何消息 – Fatemeh
它的一个例子,所以基本上在这个例子中,我们从服务器(在json中)获取数据并将其显示到Textview中。 你必须根据你的要求修改它 –
我编辑了我的代码。我把文本视图,我把我编辑的代码再次质疑。在调用dc.doInBackground(totalMsg)后;在displaymsg()方法中。只有doInBackground被调用并返回,没有文字视图中显示。我不应该在doInBackground方法中调用publishProgress? – Fatemeh
试试下面的代码
private int DisplayMsg(String msg) {
totalMsg += msg;
DisplayMsgClass dc = new DisplayMsgClass();
dc.runner.execute(totalMsg);
}
希望它会工作
:)GlbMP
对不起,但在直流亚军是不明确的。我写了dc.onPostExecute(totalMsg);但是当textv.setText(result);在方法onPostExecute(字符串结果)中执行textview内容没有改变:(为什么需要进度条?它是做什么的? – Fatemeh
你是什么意思'int value = obj.doInBackground(msg);'?请参阅[AsyncTask](https://developer.android.com/reference/android/os/AsyncTask.html)以获取正确的AsyncTask实现 –
这并不重要,我把它放在确保DisplayMsg被执行并创建一个时间可以看到对话框 – Fatemeh
好吧,使用'obj.execute(“”);'而不是'int value = obj.doInBackground(msg);'并检查'ProgressDialog'是否显示 –