首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android进度条未显示

Android进度条未显示
EN

Stack Overflow用户
提问于 2011-04-28 13:47:25
回答 3查看 2K关注 0票数 2
代码语言:javascript
复制
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();
}

.

代码语言:javascript
复制
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;}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-28 14:05:04

你立即从你的线程中检索InputStream,很可能它仍然是空的,或者有它的初始值,还没有得到http响应。这样,您的进度对话框最多显示几毫秒。

在调用thread.start()之后结束您的loginRequest,如果您使用Handler获得了UI线程的结果或任何异常,则从线程的run方法中进行通信。在处理程序的handleMessage中检查loginRequest的结果(结果输入流应直接传递给处理程序,而不是从线程中检索它),并删除进度对话框。

以下是如何使用线程实现所需功能的更新示例:

在下面的代码中,您的main activity被引用为LoginActivity (因为我不知道您的类名),所以您应该将其更改为您拥有loginRequest方法的java activity类的名称。

从您的主活动中删除showProgressDialog()方法,并放入:

代码语言:javascript
复制
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类也是如此:

代码语言:javascript
复制
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实现,让它做您需要的事情。

我希望代码能把这种方法讲清楚一点。

票数 2
EN

Stack Overflow用户

发布于 2011-04-28 13:56:59

不要调用thread.run(),而要调用thread.start()

run()在同一线程上调用函数run()start()将在新线程中调用它。当前,GUI线程被阻塞,因为它执行本应在后台线程中完成的操作。

您可以通过以下方式调用线程:

代码语言:javascript
复制
Thread thread = new Thread(new loginThread(serverURL, name, password,getMyIMENumber()));
thread.start();

或者让你的loginThread 扩展线程,而不是实现Runnable。

票数 3
EN

Stack Overflow用户

发布于 2011-04-28 14:01:02

除非您调用进度对话框的show方法,否则它不会显示。

代码语言:javascript
复制
do this in your showProgressDialog method -- mDialog.show();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5814170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档