2011-11-24 56 views
0

我正在开发一个Android应用程序,我需要将图像上传到服务器。缩放位图并上传到服务器,UI线程阻塞

之前我上传的图片,我就扩展到500与Bitmap.createScaledBitmap()

一个最大宽度/高度我的问题是,即使我做这两个步骤的UI线程获取的卡在后台线程中。

我的代码如下所示:

dialog = ProgressDialog.show(this, "", "Loading...", true); 
// upload the image to the server 
Thread t = new Thread() { 
    @Override 
    public void run() { 
     bmp = BitmapHelper.scaleBmp(bmp, 500);//bmp is a private class Bitmap 
     try { 
      HttpResponse response = Helper.uploadBitmap(bmp); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
       response.getEntity().getContent(), "UTF-8")); 
      StringBuilder builder = new StringBuilder(); 
      for (String line = null; (line = reader.readLine()) != null;) { 
       builder.append(line).append("\n"); 
      } 
      finalResult = new JSONObject(builder.toString()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       handleData(); 
      } 
     }); 
    } 
}; 
t.run(); 

关于如何正确做到这一点任何帮助将非常感激!

编辑:添加handleData()函数

public void handleData() { 
    take.setVisibility(View.VISIBLE); 
    select.setVisibility(View.VISIBLE); 

    process.setVisibility(View.GONE); 
    select_new.setVisibility(View.GONE); 

    message = "An error occured! Please try again."; 
    boolean success = false; 
    try { 
     success = finalResult.getBoolean("success"); 
     url = "http://url"; 
     url += finalResult.getString("path"); 
     thumbnail = finalResult.getString("thumbnail"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e(TAG, e.getMessage()); 
    } 
    if (success) { 
     message = "Picture was uploaded successfuly!"; 
    } 
    dialog.dismiss(); 
    Config.toast(this, message); 

    Thread t = new Thread() { 
     @Override 
     public void run() { 
      final Bitmap b = HttpHelper.getBitmapFromURL(thumbnail); 
      preview_image.post(new Runnable() { 
       @Override 
       public void run() { 
        preview_image.setImageBitmap(b); 
        preview_image.setVisibility(View.VISIBLE); 
        preview_image.setOnClickListener(context); 
       } 
      }); 
     } 
    }; 
    t.run(); 
} 
+0

handleData是做什么的?它在UI上做了什么? – brianestey

+0

刚刚添加功能的帖子。问题是,即使在显示对话框之前它仍然卡住(第一段代码) – Olivier

回答

1

你是不是开始新主题。你正在创建线程对象,但你永远不会开始新的线程。相反,您只需执行当前线程中运行的方法。有关如何启动新线程的参考信息,请参阅Defining and Starting a Thread

作为@LuxuryMode说,AsyncTask是Android上长时间运行的操作的一个非常好的选择,它不应该阻塞ui线程。

+0

Duh ...非常感谢!这绝对是问题。 – Olivier

1

我认为这个问题是你开始一个新的thread,然后它里面你使用Handler张贴另一runnable。因此,Handler与此新的Thread相关联,您无法操作该thread的UI线程。 在我看来,你真的应该使用AsyncTask,它为从后台线程切换到UI线程提供了便利。

http://developer.android.com/reference/android/os/AsyncTask.html

+0

感谢您的提示。明天我会试一试。 – Olivier

1

除了其他海报说的,运行线程是通过调用start()而不是run()完成的。