[英]Android Progress bar not showing up
private Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
removeDialog(0);
switch (msg.what)
{
case SUCCESS:
Log.i("LoginActivity", "Got inputstream");
final InputStream is = (InputStream)msg.obj;
if (is != null)
{
//TODO: examine the input stream, etc...
}
break;
case FAILURE:
Log.i("LoginActivity", "Login failed");
//TODO: Failure handling
break;
default:
break;
}
}
};
@Override
protected Dialog onCreateDialog(int id)
{
switch (id)
{
case 0:
{
dialog = new ProgressDialog(this);
dialog.setMessage("Please wait...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
return dialog;
}
}
return null;
}
public void loginRequest(String name,String password)
{
showDialog(0);
loginThread thread = new loginThread(serverURL, name, password,getMyIMENumber(), handler);
thread.start();
}
…………………………………………………………………………
public class loginThread extends Thread {
String name;
String password;
InputStream is;
String Url;
String ime;
private final Handler handler;
public loginThread(String Url,String name,String password,String ime,final Handler handler) {
this.name = name;
this.Url = Url;
this.password = password;
this.ime = ime;
this.handler = handler;
}
public void run() {
try{
HttpClient httpClient = new DefaultHttpClient();
String loginURL = Url+"member/login";
HttpPost httppost = new HttpPost(loginURL);
HttpParams httpParameters = new BasicHttpParams();
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
if(name.contentEquals(""))
{
pairs.add(new BasicNameValuePair("ime", ime));
}
else
{
pairs.add(new BasicNameValuePair("userName", name));
pairs.add(new BasicNameValuePair("password", password));
}
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
httppost.setEntity(new UrlEncodedFormEntity(pairs));
HttpResponse response = httpClient.execute(httppost);
HttpEntity entity = response.getEntity();
final InputStream is = entity.getContent();
Message message = new Message();
message.obj = is;
message.what = server.SUCCESS;
handler.sendMessage(message);
}catch(Exception e){
Log.e("log_tag", "Error in http connection " + e.toString(), e);
handler.sendEmptyMessage(server.FAILURE);
}
}
}
进度对话框没有显示我在这里做错了什么..请帮助我..
……………………………………………………………………………………………………………………
// 编译自 DexFile.java (version 1.5: 49.0, super bit) public final class dalvik.system.DexFile {
// 方法描述符 #8 (Ljava/io/File;)V // Stack: 3, Locals: 2 public DexFile(java.io.File file) throws java.ZF98ED07A4D5F50F7DE1410D; 0 aload_0 [this] 1 invokespecial java.lang.Object() [1] 4 new java.lang.RuntimeException [2] 7 dup 8 ldc [3] 10 invokespecial java.lang.RuntimeException(java.lang.String) [4 ] 13 athrow 行号:[pc:0, line:4] 局部变量表:[pc:0, pc:14] local: this index: 0 type: dalvik.system.DexFile [pc: 0, pc: 14]本地:文件索引:1 类型:java.io.File
// 方法描述符 #18 (Ljava/lang/String;)V // Stack: 3, Locals: 2 public DexFile(java.lang.String fileName) throws java.io.IOException; 0 aload_0 [this] 1 invokespecial java.lang.Object() [1] 4 new java.lang.RuntimeException [2] 7 dup 8 ldc [3] 10 invokespecial java.lang.RuntimeException(java.lang.String) [4 ] 13 athrow 行号:[pc:0,line:5] 局部变量表:[pc:0,pc:14] local:this index:0 type:dalvik.system.DexFile [pc:0,pc:14]本地:文件名索引:1 类型:java.lang.String
// 方法描述符 #22 (Ljava/lang/String;Ljava/lang/String;I)Ldalvik/system/DexFile; // Stack: 3, Locals: 3 public static dalvik.system.DexFile loadDex(java.lang.String sourcePathName, java.lang.String outputPathName, int flags) throws java.io.IOException; 0 new java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException(java.lang.String) [4] 9 athrow Line numbers: [pc: 0, line:]表:[pc:0,pc:10] 本地:sourcePathName 索引:0 类型:java.lang.String [pc:0,pc:10] 本地:outputPathName 索引:1 类型:Z93F725A07423FE1C889F448B33D20F46Z.lang.String [pc: , pc: 10] 本地:标志索引:2 类型:int
// 方法描述符 #28 ()Ljava/lang/String; // Stack: 3, Locals: 1 public java.lang.String getName(); 0 new java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException(java.lang.String) [4] 9 athrow Line numbers: [pc: 0, line:]表:[pc:0,pc:10] 本地:此索引:0 类型:dalvik.system.DexFile
// 方法描述符 #30 ()V // Stack: 3, Locals: 1 public void close() throws java.io.IOException; 0 new java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException(java.lang.String) [4] 9 athrow Line numbers: [pc: 0, line:] 局部变量表:[pc:0,pc:10] 本地:此索引:0 类型:dalvik.system.DexFile
// 方法描述符 #32 (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class; // Stack: 3, Locals: 3 public java.lang.Class loadClass(java.lang.String name, java.lang.ClassLoader loader); 0 new java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException(java.lang.String) [4] 9 athrow Line numbers: [pc: 0, line:]表:[pc:0,pc:10] 本地:此索引:0 类型:dalvik.system.DexFile [pc:0,pc:10] 本地:名称索引:1 类型:java.lang.String [pc:0 , pc: 10] 本地:加载程序索引:2 类型:java.lang.ClassLoader
// 方法描述符 #37 ()Ljava/util/Enumeration; // 签名:()Ljava/util/Enumeration; // Stack: 3, Locals: 1 public java.util.Enumeration entries(); 0 new java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException(java.lang.String) [4] 9 athrow Line numbers: [pc: 0, line:]表:[pc:0,pc:10] 本地:此索引:0 类型:dalvik.system.DexFile
// 方法描述符 #30 ()V // Stack: 3, Locals: 1 protected void finalize() throws java.io.IOException; 0 new java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 invokespecial java.lang.RuntimeException(java.lang.String) [4] 9 athrow Line numbers: [pc: 0, line:表:[pc:0,pc:10] 本地:此索引:0 类型:dalvik.system.DexFile
// Method descriptor #42 (Ljava/lang/String;)Z public static native boolean isDexOptNeeded(java.lang.String arg0) throws java.io.FileNotFoundException, java.io.IOException; }
不要调用thread.run()
而是调用thread.start()
。
run()
run()
。 start()
将在新线程中调用它。 当前 GUI 线程被阻塞,因为它执行应该在后台线程中完成的操作。
您可以通过以下方式调用线程:
Thread thread = new Thread(new loginThread(serverURL, name, password,getMyIMENumber()));
thread.start();
或者让你的 loginThread扩展Thread 而不是实现 Runnable。
您立即从线程中检索InputStream
,它很可能仍然是 null,或者具有其初始值,但尚未得到 http 响应。 这样,您的进度对话框最多显示几毫秒。
在调用thread.start()
后结束您的loginRequest
,如果您使用Handler
获得结果或 UI 线程的任何异常,则从线程的run
方法中进行通信。 在处理程序的handleMessage
检查loginRequest
的结果(结果输入 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 最好直接传递给处理程序,而不是从线程中检索它),并删除您的进度对话框。
更新这里是一个示例如何使用线程实现您想要的:
在下面的代码中,您的主要活动被引用为LoginActivity
(因为我不知道您的类的名称),因此您应该将其更改为 java 活动 class 的名称,其中您有loginRequest
方法。
从您的主要活动中删除showProgressDialog()
方法,改为:
public static final int FAILURE = 0;
public static final int SUCCESS = 1;
private ProgressDialog dialog;
private Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
removeDialog(0);
switch (msg.what)
{
case SUCCESS:
Log.i("LoginActivity", "Got inputstream");
final InputStream is = (InputStream)msg.obj;
if (is != null)
{
//TODO: examine the input stream, etc...
}
break;
case FAILURE:
Log.i("LoginActivity", "Login failed");
//TODO: Failure handling
break;
default:
break;
}
}
};
@Override
protected Dialog onCreateDialog(int id)
{
switch (id)
{
case 0:
{
dialog = new ProgressDialog(this);
dialog.setMessage("Please wait...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
return dialog;
}
}
return null;
}
public void loginRequest(String name, String password)
{
showDialog(0);
LoginThread thread = new LoginThread(serverURL, name, password,
getMyIMENumber(), handler);
thread.start();
}
请注意, loginRequest
方法已更改!
您的LoginThread
class 也是如此:
public class LoginThread extends Thread
{
private final String name;
private final String password;
private final String url;
private final String ime;
private final Handler handler;
public LoginThread(String Url, String name, String password,
String ime, final Handler handler)
{
this.name = name;
this.url = Url;
this.password = password;
this.ime = ime;
this.handler = handler;
}
public void run()
{
try
{
HttpClient httpClient = new DefaultHttpClient();
String loginURL = url + "member/login";
HttpPost httppost = new HttpPost(loginURL);
HttpParams httpParameters = new BasicHttpParams();
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
if (name.contentEquals(""))
{
pairs.add(new BasicNameValuePair("ime", ime));
}
else
{
pairs.add(new BasicNameValuePair("userName", name));
pairs.add(new BasicNameValuePair("password", password));
}
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters,
timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
httppost.setEntity(new UrlEncodedFormEntity(pairs));
HttpResponse response = httpClient.execute(httppost);
HttpEntity entity = response.getEntity();
final InputStream is = entity.getContent();
Message message = new Message();
message.obj = is;
message.what = LoginActivity.SUCCESS;
handler.sendMessage(message);
}
catch (Exception e)
{
Log.e("log_tag", "Error in http connection " + e.toString(), e);
handler.sendEmptyMessage(LoginActivity.FAILURE);
}
}
}
现在你的LoginThread
实例有一个Handler
类型的新成员。 它通过构造函数参数(与其他参数一样)进行初始化,因此您可以将其声明为final
。
如果它从 http 响应中获得输入 stream,或者由于某种原因失败,此处理程序将通知您的 UI 线程(主要活动)。
完成Handler
实现,让它做你需要的。
我希望代码澄清了这种方法。
除非您调用进度对话框的 show 方法,否则它不会显示。
do this in your showProgressDialog method -- mDialog.show();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.