2012-03-17 1 views
0

, когда я запускаю следующий кодЯ использую следующий код для загрузки pic с локального хоста. Это приводит к непредвиденной ошибке

Runnable r = new Runnable() { 

    @Override 
    public void run() { 

     final String urlString = "http://10.0.2.2/conn/s.png"; 
      // URL newurl = null; 

        try{ 
       do 
       { 
          if (ch==1) 
          { 
           //Thread.sleep(7000); 
           HttpGet httpRequest = new HttpGet(new URL(urlString).toURI()); 
           HttpClient httpClient = new DefaultHttpClient(); 
           HttpResponse response = (HttpResponse) httpClient.execute(httpRequest); 
           HttpEntity entity = response.getEntity(); 
           BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 
            InputStream is = bufHttpEntity.getContent(); 
            Bitmap bitmap = BitmapFactory.decodeStream(is); 
            im.destroyDrawingCache(); 
            im.setImageBitmap(bitmap); 
            bitmap=null; 
            // Thread.sleep(3000); 
            out.write(1); 
            out.flush(); 




           } 
       } 
       while((ch=in.read()) == 1); 
        } 
        catch(IOException ex) 
        { 

        } 
        catch(URISyntaxException ex) 
        {} 
    } 
}; 

и нить инициализируются так:

    t = new Thread(r); 
      t.start(); 

Я получаю следующее исключение:

03-18 01:20:50.399: E/AndroidRuntime(305): at android.view.ViewRoot.checkThread(ViewRoot.java:2683) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.view.ViewRoot.requestLayout(ViewRoot.java:557) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.view.View.requestLayout(View.java:7918) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.view.View.requestLayout(View.java:7918) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.view.View.requestLayout(View.java:7918) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.view.View.requestLayout(View.java:7918) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.view.View.requestLayout(View.java:7918) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.widget.ImageView.setImageDrawable(ImageView.java:306) 
03-18 01:20:50.399: E/AndroidRuntime(305): at android.widget.ImageView.setImageBitmap(ImageView.java:320) 
03-18 01:20:50.399: E/AndroidRuntime(305): at remote.presentation.rshare$1.run(rshare.java:124) 
03-18 01:20:50.399: E/AndroidRuntime(305): at java.lang.Thread.run(Thread.java:1096) 
+0

Можете ли вы отправить свое полное исключение stacktrace. –

ответ

2

Вы меняют пользовательский интерфейс из потока, не могут сделать это в Android. Это должно быть сделано в потоке пользовательского интерфейса. Я предпочитаю использовать AsyncTasks для использования Threads. Эта AsyncTask получит изображение с URL-адреса.

Класс

private class GetImage extends AsyncTask<String,Void,Bitmap>{ 

    private ImageView view; 

    public GetImage(ImageView iv){ 
     this.view = iv; 
    } 

    protected Bitmap doInBackground(String... params) { 
        //background thread 
     try { 

      return BitmapFactory.decodeStream((InputStream)new URL(params[0]).getContent()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 

     } catch (IOException e) { 
      e.printStackTrace(); 

     } 

     return null; 

    } 
    @Override 
    protected void onPostExecute(Bitmap b){ 
     if(b != null) 
      this.view.setImageBitmap(b); 
    } 
} 

использовать его

new GetImage(myImageView).execute(someURL); 

EDIT (причина для редактирования, см комментарии) - следующий код будет повторно загрузить то же изображение, вопрос Аскер хотел

Создайте переменную класса для класса GetImage

GetImage getImageInstance = new GetImage(myImageView); 
getImageInstance.execute(url); 

Модифицированного класс

private class GetImage extends AsyncTask<String,Bitmap,Void>{ 

    private ImageView view; 
    Bitmap bitmap = null; 
    long lastUpdateTimestamp = System.currentTimeMillis(); 
    public GetImage(ImageView iv){ 
     this.view = iv; 
    } 

    protected Bitmap doInBackground(String... params) { 
        //background thread 
     while(running){ 
      try { 
       //if more than 2 seconds have elapsed update the image 
       if((System.currentTimeMillis() - lastUpdateTimestamp) > 2000){ 
        bitmap = BitmapFactory.decodeStream((InputStream)new URL(params[0]).getContent()); 
        pubilshProgress(bitmap); 
       } 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 

      } catch (IOException e) { 
       e.printStackTrace(); 

      } 
     } 
     return null; 

    } 
    //this method that will update the UI 
    @Override 
    protected void onProgressUpdate(Bitmap... images){ 
     if(images[0] != null) 
      this.view.setImageBitmap(images[0]); 
     lastUpdateTimestamp = System.currentTimeMillis(); 
    } 
    @Override 
    protected void onPostExecute(Void unused){ 
     bitmap.recycle(); 
    } 
    public void stopDownloading(){ 
     running = false; 
    } 
} 

Чтобы остановить загрузку

getImageInstance.stopDownloading(); 

Я не знаю, что делает ваше приложение, но пользователи не любят загружать ненужные изображения, которые съедают в их учет данных, возможно, думают о лучшем способе делать то, что вы хотите сделать.

+0

тригг, как я могу потокового файла изображения постоянно через каждые 3 секунды –

+0

Я не понимаю, что вы подразумеваете под «потоком изображения». – triggs

+0

Я хочу загрузить изображение с сервера каждые 2 секунды и показать на экране с использованием изображения. –

Смежные вопросы