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 (版本1.5 : 49.0,超级位)公共最终类dalvik.system.DexFile {
//方法描述符#8 (Ljava/io/File;)V //堆栈: 3,本地:2个公共文件(java.io.File DexFile)抛出java.io.IOException;0 aload_0此1调用特殊java.lang.Object() 1 4新java.lang.RuntimeException 2 7 dup 8 LDC3 10调用特殊java.lang.RuntimeException(java.lang.String) 4 13行线号: pc: 0,line: 4局部变量表: pc: 0,pc: 14 local:此索引:0类型: dalvik.system.DexFile pc: 0,pc: 14 local:文件索引:1类型: java.io.File
//方法描述符#18 (Ljava/lang/String;)V //栈: 3,本地:2个公共DexFile(java.lang.String fileName)抛出java.io.IOException;0 aload_0此1调用特殊java.lang.Object() 1 4新索引2 7 dup 8 LDC3 10调用特殊java.lang.RuntimeException( java.lang.String ) 4 13行线路编号: pc: 0,line: 5局部变量表: pc: 0,pc: 14 local:此索引:0类型: dalvik.system.DexFile pc: 0,pc: 14 local: fileName index: 1类型:java.lang.String
//方法描述符#22 (Ljava/lang/String;Ljava/lang/String;I)Ldalvik/system/DexFile;//堆栈: 3,本地变量:3公共静态标志loadDex(java.lang.String sourcePathName,java.lang.String outputPathName,int dalvik.system.DexFile )抛出java.io.IOException;0新java.lang.RuntimeException 2 3 dup 4 LDC3 6调用特殊java.lang.RuntimeException( java.lang.String ) 4 9行线路编号: pc: 0,line: 6局部变量表: pc: 0,pc: 10 local: sourcePathName index: 0类型: java.lang.String pc: 0,pc: 10 local: outputPathName index: 1类型:java.lang.String pc: 0pc: 10 local:标志索引:2类型: int
//方法描述符#28 ()Ljava/lang/String;//栈: 3,本地变量:1公共java.lang.String getName();0新索引2 3 dup 4 ldc 3 6调用特殊java.lang.RuntimeException(java.lang.String) 4 9行线号: pc: 0,line: 7局部变量表: pc: 0,pc: 10 local: this index: 0 java.lang.RuntimeException :0 java.lang.RuntimeException: dalvik.system.DexFile
//方法描述符#30 ()V //堆栈: 3,局部变量:1 public void close()抛出java.io.IOException;0新索引2 3 dup 4 ldc 3 6 invokespecial java.lang.RuntimeException(java.lang.String) 4 9 athrow行号: pc: 0,line: 8局部变量表: pc: 0,pc: 10 local: this index: 0 java.lang.RuntimeException :0 type: dalvik.system.DexFile
//方法描述符#32 (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;//堆栈: 3,本地变量:3公共java.lang.Class loadClass(java.lang.String name,java.lang.ClassLoader loader);0新的java.lang.RuntimeException 2 3 dup 4 LDC3 6调用特殊java.lang.RuntimeException( java.lang.String ) 4 9行线路编号: pc: 0,line: 9局部变量表: pc: 0,pc: 10 local:此索引:0类型: dalvik.system.DexFile pc: 0,pc: 10 local:名称索引:1类型:java.lang.String pc: 0,pc: 10 local: local:2类型: java.lang.ClassLoader
//方法描述符#37 ()Ljava/util/枚举;//签名:()Ljava/util/枚举;//堆栈: 3,本地:1个公共java.util.Enumeration条目();0新java.lang.RuntimeException 2 3 dup 4 ldc 3 6调用特殊java.lang.RuntimeException(java.lang.String) 4 9行线路编号: pc: 0,line: 10局部变量表: pc: 0,pc: 10 local:此索引:0类型: dalvik.system.DexFile
//方法描述符#30 ()V // Stack: 3,Locals: 1 protected void finalize()抛出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行号: pc: 0,line: 11局部变量表: pc: 0,pc: 10 local: this index: 0类型: dalvik.system.DexFile
//方法描述符#42 (Ljava/lang/String;)Z公共静态本机布尔isDexOptNeeded(java.lang.String arg0)抛出java.io.FileNotFoundException,java.io.IOException;}
发布于 2011-04-28 14:05:04
你立即从你的线程中检索InputStream,很可能它仍然是空的,或者有它的初始值,还没有得到http响应。这样,您的进度对话框最多显示几毫秒。
在调用thread.start()之后结束您的loginRequest,如果您使用Handler获得了UI线程的结果或任何异常,则从线程的run方法中进行通信。在处理程序的handleMessage中检查loginRequest的结果(结果输入流应直接传递给处理程序,而不是从线程中检索它),并删除进度对话框。
以下是如何使用线程实现所需功能的更新示例:
在下面的代码中,您的main activity被引用为LoginActivity (因为我不知道您的类名),所以您应该将其更改为您拥有loginRequest方法的java activity类的名称。
从您的主活动中删除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类也是如此:
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。
此处理程序将通知您的UI线程(主活动),如果它从http响应中获得了输入流,或者由于某种原因而失败。
完成Handler实现,让它做您需要的事情。
我希望代码能把这种方法讲清楚一点。
发布于 2011-04-28 13:56:59
不要调用thread.run(),而要调用thread.start()。
run()在同一线程上调用函数run()。start()将在新线程中调用它。当前,GUI线程被阻塞,因为它执行本应在后台线程中完成的操作。
您可以通过以下方式调用线程:
Thread thread = new Thread(new loginThread(serverURL, name, password,getMyIMENumber()));
thread.start();或者让你的loginThread 扩展线程,而不是实现Runnable。
发布于 2011-04-28 14:01:02
除非您调用进度对话框的show方法,否则它不会显示。
do this in your showProgressDialog method -- mDialog.show();https://stackoverflow.com/questions/5814170
复制相似问题