2012-09-06 3 views
0

J'utilise Google Chart API pour créer des graphiques dans mon application.AsyncTask télécharger les erreurs d'image

Dans mon cas, j'ai besoin de télécharger l'image sur chaque graphique. J'utilise AsyncTask pour ça.

Pour surveiller les processus de téléchargement, j'utilise la boîte de dialogue Progression. Mais a eu une erreur dans cette classe de AsyncTask.

exécuter des AsyncTask:

new loadChart(ChartAct.this,img).execute(); 

et code de AsyncTask:

public class loadChart extends AsyncTask<Void, Void, Void> { 
    private ImageView img; 
    private Context con; 
    private ProgressDialog dialog; 

    public loadChart(Context context, ImageView img1) { 
     this.img = img1; 
     this.con = context; 
    } 

    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(con, "Connecting:", 
       "Loading. Please wait...", true); 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     final Bitmap bitmap = DownloadImage(); 
     img.setImageBitmap(bitmap); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     dialog.dismiss(); 
     super.onPostExecute(result); 
    } 

    private static InputStream OpenHttpConnection(String urlString) 
      throws IOException { 

     Log.d("palval", "OpenHttpConnection"); 
     InputStream in = null; 
     int response = -1; 

     URL url = new URL(urlString); 
     URLConnection conn = url.openConnection(); 

     if (!(conn instanceof HttpURLConnection)) 
      throw new IOException("Not an HTTP connection"); 

     try { 
      HttpURLConnection httpConn = (HttpURLConnection) conn; 
      httpConn.setAllowUserInteraction(false); 
      httpConn.setInstanceFollowRedirects(true); 
      httpConn.setRequestMethod("GET"); 
      httpConn.connect(); 

      response = httpConn.getResponseCode(); 

      if (response == HttpURLConnection.HTTP_OK) { 
       in = httpConn.getInputStream(); 
      } 

      String res = Integer.toString(response); 
     } catch (Exception ex) { 
      throw new IOException("Error connecting"); 
     } 
     return in; 
    } 

    public static Bitmap DownloadImage() { 
     Log.d("palval", "DownloadImage"); 
     Bitmap bitmap = null; 
     InputStream in = null; 
     try { 

      in = OpenHttpConnection("https://chart.googleapis.com/chart?chs=440x220&chd=t:60,40&cht=p3&chl=Hello|World"); 
      bitmap = BitmapFactory.decodeStream(in); 
      in.close(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     return bitmap; 
    } 

} 

erreurs:

09-06 18:35:35.574: E/AndroidRuntime(2502): FATAL EXCEPTION: AsyncTask #1 
09-06 18:35:35.574: E/AndroidRuntime(2502): java.lang.RuntimeException: An error occured while executing doInBackground() 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.lang.Thread.run(Thread.java:864) 
09-06 18:35:35.574: E/AndroidRuntime(2502): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4132) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:723) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.view.View.requestLayout(View.java:12957) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.view.View.requestLayout(View.java:12957) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.view.View.requestLayout(View.java:12957) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.view.View.requestLayout(View.java:12957) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.view.View.requestLayout(View.java:12957) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.widget.ImageView.setImageDrawable(ImageView.java:362) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.widget.ImageView.setImageBitmap(ImageView.java:377) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at com.example.headache.loadChart.doInBackground(loadChart.java:37) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at com.example.headache.loadChart.doInBackground(loadChart.java:1) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
09-06 18:35:35.574: E/AndroidRuntime(2502):  ... 5 more 
09-06 18:35:36.055: E/WindowManager(2502): Activity com.example.headache.ChartAct has leaked window [email protected] that was originally added here 
09-06 18:35:36.055: E/WindowManager(2502): android.view.WindowLeaked: Activity com.example.headache.ChartAct has leaked window [email protected] that was originally added here 
09-06 18:35:36.055: E/WindowManager(2502): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:352) 
09-06 18:35:36.055: E/WindowManager(2502): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:373) 
09-06 18:35:36.055: E/WindowManager(2502): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:321) 
09-06 18:35:36.055: E/WindowManager(2502): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:152) 
09-06 18:35:36.055: E/WindowManager(2502): at android.view.Window$LocalWindowManager.addView(Window.java:541) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.Dialog.show(Dialog.java:301) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.ProgressDialog.show(ProgressDialog.java:116) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.ProgressDialog.show(ProgressDialog.java:99) 
09-06 18:35:36.055: E/WindowManager(2502): at com.example.headache.loadChart.onPreExecute(loadChart.java:29) 
09-06 18:35:36.055: E/WindowManager(2502): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561) 
09-06 18:35:36.055: E/WindowManager(2502): at android.os.AsyncTask.execute(AsyncTask.java:511) 
09-06 18:35:36.055: E/WindowManager(2502): at com.example.headache.ChartAct.onCreate(ChartAct.java:31) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.Activity.performCreate(Activity.java:4531) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.ActivityThread.access$600(ActivityThread.java:139) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261) 
09-06 18:35:36.055: E/WindowManager(2502): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-06 18:35:36.055: E/WindowManager(2502): at android.os.Looper.loop(Looper.java:154) 
09-06 18:35:36.055: E/WindowManager(2502): at android.app.ActivityThread.main(ActivityThread.java:4945) 
09-06 18:35:36.055: E/WindowManager(2502): at java.lang.reflect.Method.invokeNative(Native Method) 
09-06 18:35:36.055: E/WindowManager(2502): at java.lang.reflect.Method.invoke(Method.java:511) 
09-06 18:35:36.055: E/WindowManager(2502): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-06 18:35:36.055: E/WindowManager(2502): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-06 18:35:36.055: E/WindowManager(2502): at dalvik.system.NativeStart.main(Native Method) 

Répondre

1

Vous ne pouvez pas définir une image en doInBackground() faire revenir un bitmap et le mettre dans le onPostExecute()

public class loadChart extends AsyncTask<Void, Void, Bitmap> { 
    private ImageView img; 
    private Context con; 
    private ProgressDialog dialog; 

    public loadChart(Context context, ImageView img1) { 
     this.img = img1; 
     this.con = context; 
    } 

    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(con, "Connecting:", 
       "Loading. Please wait...", true); 
     super.onPreExecute(); 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 
     final Bitmap bitmap = DownloadImage(); 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     dialog.dismiss(); 
     img.setImageBitmap(result); 
    } 
0

Vous ne pouvez pas accéder à l'interface utilisateur de doInBackground() et c'est ce que vous faites en réglant bitmap avec votre img.setImageBitmap(bitmap);. Si vous devez le faire pendant que vous effectuez une activité d'arrière-plan, utilisez runOnUiThread(), déplacez votre code d'accès à l'interface utilisateur vers onPostExecute() ou stockez le bitmap dans l'objet, mais attribuez-le à l'élément de l'interface utilisateur dans onProgressUpdate(). En général, jetez un oeil à AsyncTask documentation.

+0

que je peux le faire en postExecute? – Val

+0

Oui, vous devriez retourner votre bitmap dans 'doInBackground()', et le définir dans le 'onPostExecute()' – tolgap

+0

@ p.Valery voir la réponse éditée –

0

Vous ne pouvez pas modifier l'élément d'interface utilisateur à partir de doInBackground(). Essayez la méthode runOnUIThread() de votre activité ou placez la méthode qui modifie l'interface utilisateur dans la méthode onPostExecute().

Lire this answer pour plus de détails.