2016-11-08 1 views
-2

나는 단절에서 이미지를 다운로드하지만 나는이 코드를 사용하고 이미지, 다운로드 마무리 될 때까지 앱이 UI를로드 할 수 없습니다 활동했습니다 :난 내 안드로이드 응용 프로그램에서 느린 UI를

private Toolbar toolbar; 
private ImageView downloadedImg; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    downloadedImg = (ImageView) findViewById(R.id.Main_Image_ID); 
    toolbar = (Toolbar) findViewById(R.id.Main_Appbar_ID); 

    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayShowHomeEnabled(true); 

    NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) 
      getSupportFragmentManager().findFragmentById(R.id.Main_Activity_navigation_drawer_ID); 
    drawerFragment.setUp(R.id.Main_Activity_navigation_drawer_ID, (DrawerLayout) findViewById(R.id.Main_DrawerLayout_ID), toolbar); 


    ImageDownloader task = new ImageDownloader(); 
    Bitmap myImage; 

    try { 
     myImage = task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c").get(); 

     downloadedImg.setImageBitmap(myImage); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Log.i("Interaction", "Button Tapped"); 
} 

public void ViewMone(View view) { 
    startActivity(new Intent(MainActivity.this,MainWebViewActivity.class)); 
} 


public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... urls) { 
     try { 
      URL url = new URL(urls[0]); 
      HttpURLConnection connection = (HttpsURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream inputStream = connection.getInputStream(); 
      //to convert Image from string data to bitmap 
      Bitmap myBitmap = BitmapFactory.decodeStream(inputStream); 

      return myBitmap; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

답변

2

당신은 제대로 AysncTask 클래스를 사용하지 마십시오. get()을 호출하면 이미지가 다운로드 될 때까지 주 스레드가 일시 중지됩니다. 그것이 UI가 느린 이유입니다.

private Toolbar toolbar; 
private ImageView downloadedImg; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    // ... omitted ... 

    ImageDownloader task = new ImageDownloader();  
    task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c"); 

} 

// ... omitted ...  

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... urls) { 
     try { 
      URL url = new URL(urls[0]); 
      HttpURLConnection connection = (HttpsURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream inputStream = connection.getInputStream(); 
      //to convert Image from string data to bitmap 
      Bitmap myBitmap = BitmapFactory.decodeStream(inputStream); 

      return myBitmap; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Bitmap result) { 

     downloadedImg.setImageBitmap(result); 
    } 
} 
+0

정말 감사합니다 사람이 그렇게 좋은 작품 :

대신, 작업의 onPostExecute 방법에서 이미지를 설정해야합니다 –

0

이 작업은 비동기 적으로 수행해야하며 기본 작업에서는 수행하지 말아야합니다. 그렇지 않으면 다운로드가 완료 될 때까지 페이지가 차단됩니다. 이를 수행 할 수있는 많은 옵션이 있습니다. 당신이 비동기 작업에 대한 설명서를 보면

Android : Loading an image from the Web with Asynctask

0

, 당신은 get() 다음과 같은 설명을

대기하는 경우가 있습니다 것을 발견 할 것이다 :이 질문의 허용 대답에 표시된대로 나는 최선을 생각한다 계산이 완료 될 때까지 기다린 다음 결과를 검색합니다. 대신 당신이 당신의 AsyncTask를 서브 클래스에서 onPostExecute를 구현하고이 이미지를 처리해야 get()를 호출

. 안드로이드 개발자 페이지에도 예제가 있습니다.

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 
    <...> 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     downloadedImg.setImageBitmap(result); 
    } 
} 
관련 문제