2012-12-22 71 views
1

我試圖從不同的URL顯示圖像在ListView中,我從一個jsonarray接收我的url和其他細節,我從圖形api獲取,從中我正在解析我的數據到列表中,並在列表視圖中顯示詳細信息,但jsonobject正在給我的圖像文件的URL,我想我需要先下載並顯示比通過延遲加載,我正在關注本教程懶加載 - http://wptrafficanalyzer.in/blog/android-lazy-loading-images-and-text-in-listview-from-http-json-data/。我正在實現一個片段類,並在運行該應用程序就停止工作。我會非常感謝您提供的任何幫助。從url下載圖像並將其實現爲android的列表視圖

這裏是我的代碼

Request request1 = new Request(session,"/fql",params,HttpMethod.GET,new Request.Callback() 
      { 
       public void onCompleted(Response response) 
       { 

        int indexex=nthOccurrence(response.getGraphObject().toString(),'{',1); 
        int index=response.getGraphObject().toString().length()-1; 
        String edit=response.getGraphObject().toString().substring(indexex, index); 
        try 
        { 
         JSONObject json = Util.parseJson(edit); 
         JSONArray data = json.getJSONArray("data"); 
         JSONObject getVideo = data.getJSONObject(2); 
         String s="{data:"+getVideo.getString("fql_result_set")+"}"; 
         JSONObject json1 = Util.parseJson(s); 
         JSONArray data1 = json1.getJSONArray("data"); 
         ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask(); 
         listViewLoaderTask.execute(data1); 
} 
        catch(Exception e){ 
         userNameView.setText(e.toString()); 
        } 
       }     
      }); 
      Request.executeBatchAsync(request1); 

private class DisplayDetails extends AsyncTask<Session, Void, JSONArray> 
    { 
     Session session; 
     Request request1; 
     @Override 
     protected JSONArray doInBackground(Session...sessions) 
     { 
      session=sessions[0]; 
      Request request = Request.newMeRequest(session, new Request.GraphUserCallback() 
      { 
       @Override 
       public void onCompleted(GraphUser user, Response response) 
       { 
        if (user != null) 
        { 
         profilePictureView.setProfileId(user.getId()); 
         // Set the Textview's text to the user's name 
         userNameView.setText(user.getName()); 
        } 
       } 
       }); 
      Request.executeBatchAsync(request); 
      String fqlQuery = "{'myVideos':'SELECT vid, src, owner, title, description,thumbnail_link, created_time FROM video WHERE owner=me()'," + 
        "'friends':'SELECT uid2 FROM friend WHERE uid1 = me()',"+ 
        "'friendsVideo':'SELECT vid, src, owner, title, description,thumbnail_link, created_time FROM video WHERE owner IN "+ 
        "(SELECT uid2 FROM #friends) ORDER BY created_time',}"; 

      Bundle params = new Bundle(); 

      params.putString("q", fqlQuery); 

      Session session1 = Session.getActiveSession(); 
      request1 = new Request(session,"/fql",params,HttpMethod.GET,new Request.Callback() 
      { 
       public void onCompleted(Response response) 
       { 

        int indexex=nthOccurrence(response.getGraphObject().toString(),'{',1); 
        int index=response.getGraphObject().toString().length()-1; 
        String edit=response.getGraphObject().toString().substring(indexex, index); 
        try 
        { 
         JSONObject json = Util.parseJson(edit); 
         JSONArray data = json.getJSONArray("data"); 
         String fbGraph; 
         JSONObject getVideo = data.getJSONObject(2); 
         String s="{data:"+getVideo.getString("fql_result_set")+"}"; 
         JSONObject json1 = Util.parseJson(s); 
         data1 = json1.getJSONArray("data"); 
        } 
        catch(Exception e){} 

       } 
      }); 
      return data1; 
     } 

     @Override 
     protected void onPostExecute(JSONArray data1) 
     { 
      ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask(); 
      listViewLoaderTask.execute(data1); 
      Request.executeBatchAsync(request1); 
     } 

    } 

    private class ListViewLoaderTask extends AsyncTask<JSONArray, Void, SimpleAdapter> 
    { 

     JSONObject getVidDetails; 
     // Doing the parsing of xml data in a non-ui thread 
     @Override 
     protected SimpleAdapter doInBackground(JSONArray... data) 
     { 
      HashMap<String, Object> hm = new HashMap<String,Object>(); 
      List<HashMap<String, Object>> videoDetails = null; 
      userNameView.setText("dsrf"); 
      try{ 
       for (int i = 0, size = data1.length(); i < size; i++) 
       {     
        getVidDetails=data[0].getJSONObject(i); 
        hm.put("title", "Title : " + getVidDetails.getString("title")); 
        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
        hm.put("creationDate","Created On : " + formatter.format(Long.valueOf(getVidDetails.getString("created_time")).longValue()*1000)); 
        hm.put("videoThumbnail", R.drawable.blank); 
        hm.put("thumbnail_path",getVidDetails.getString("thumbnail_link")); 
        hm.put("owner","Owner : " +getVidDetails.getString("owner")); 
        videoDetails.add(hm); 
       } 

      }catch(Exception e){ 
       Log.d("JSON Exception1",e.toString()); 
      } 

      String[] itemControl = {"videoThumbnail","title","creationDate","owner"}; 
      int[] itemLayout={R.id.videoThumb,R.id.title,R.id.creationDate,R.id.owner}; 
      SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), videoDetails, R.layout.listvideos_layout, itemControl, itemLayout); 

      return adapter; 
     } 

     *//** Invoked by the Android on "doInBackground" is executed *//* 
     @Override 
     protected void onPostExecute(SimpleAdapter adapter) 
     { 

      // Setting adapter for the listview 
      listView.setAdapter(adapter); 

      for(int i=0;i<adapter.getCount();i++){ 
       HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(i); 
       String imgUrl = (String) hm.get("thumbnail_path"); 
       ImageLoaderTask imageLoaderTask = new ImageLoaderTask(); 

       HashMap<String, Object> hmDownload = new HashMap<String, Object>(); 
       hm.put("thumbnail_path",imgUrl); 
       hm.put("position", i); 

       // Starting ImageLoaderTask to download and populate image in the listview 
       imageLoaderTask.execute(hm); 
      } 
     } 
    } 

    *//** AsyncTask to download and load an image in ListView *//* 
    private class ImageLoaderTask extends AsyncTask<HashMap<String, Object>, Void, HashMap<String, Object>>{ 

     @Override 
     protected HashMap<String, Object> doInBackground(HashMap<String, Object>... hm) { 

      InputStream iStream=null; 
      String imgUrl = (String) hm[0].get("thumbnail_path"); 
      int position = (Integer) hm[0].get("position"); 

      URL url; 
      try { 
       url = new URL(imgUrl); 

       // Creating an http connection to communicate with url 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

       // Connecting to url 
       urlConnection.connect(); 

       // Reading data from url 
       iStream = urlConnection.getInputStream(); 

       // Getting Caching directory 
       File cacheDirectory = getActivity().getBaseContext().getCacheDir(); 

       // Temporary file to store the downloaded image 
       File tmpFile = new File(cacheDirectory.getPath() + "/wpta_"+position+".jpg"); 

       // The FileOutputStream to the temporary file 
       FileOutputStream fOutStream = new FileOutputStream(tmpFile); 

       // Creating a bitmap from the downloaded inputstream 
       Bitmap b = BitmapFactory.decodeStream(iStream); 

       // Writing the bitmap to the temporary file as jpg file 
       b.compress(Bitmap.CompressFormat.JPEG,100, fOutStream); 

       // Flush the FileOutputStream 
       fOutStream.flush(); 

       //Close the FileOutputStream 
       fOutStream.close(); 

       // Create a hashmap object to store image path and its position in the listview 
       HashMap<String, Object> hmBitmap = new HashMap<String, Object>(); 

       // Storing the path to the temporary image file 
       hmBitmap.put("videoThumbnail",tmpFile.getPath()); 

       // Storing the position of the image in the listview 
       hmBitmap.put("position",position); 

       // Returning the HashMap object containing the image path and position 
       return hmBitmap; 

      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(HashMap<String, Object> result) { 
      // Getting the path to the downloaded image 
      String path = (String) result.get("videoThumbnail"); 

      // Getting the position of the downloaded image 
      int position = (Integer) result.get("position"); 

      // Getting adapter of the listview 
      SimpleAdapter adapter = (SimpleAdapter) listView.getAdapter(); 

      // Getting the hashmap object at the specified position of the listview 
      HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(position); 

      // Overwriting the existing path in the adapter 
      hm.put("videoThumbnail",path); 

      // Noticing listview about the dataset changes 
      adapter.notifyDataSetChanged(); 
     } 
    } 

我也加入了日誌文件的貓我的APP-

12-22 16:08:41.371: W/dalvikvm(625): threadid=11: thread exiting with uncaught exception (group=0x409c01f8) 
12-22 16:08:42.120: E/AndroidRuntime(625): FATAL EXCEPTION: AsyncTask #1 
12-22 16:08:42.120: E/AndroidRuntime(625): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.lang.Thread.run(Thread.java:856) 
12-22 16:08:42.120: E/AndroidRuntime(625): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.View.requestLayout(View.java:12675) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.View.requestLayout(View.java:12675) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.View.requestLayout(View.java:12675) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.View.requestLayout(View.java:12675) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.View.requestLayout(View.java:12675) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.View.requestLayout(View.java:12675) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.view.View.requestLayout(View.java:12675) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.widget.TextView.checkForRelayout(TextView.java:6773) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.widget.TextView.setText(TextView.java:3306) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.widget.TextView.setText(TextView.java:3162) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.widget.TextView.setText(TextView.java:3137) 
12-22 16:08:42.120: E/AndroidRuntime(625): at com.socialsober.LogFragment$ListViewLoaderTask.doInBackground(LogFragment.java:267) 
12-22 16:08:42.120: E/AndroidRuntime(625): at com.socialsober.LogFragment$ListViewLoaderTask.doInBackground(LogFragment.java:1) 
12-22 16:08:42.120: E/AndroidRuntime(625): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
12-22 16:08:42.120: E/AndroidRuntime(625): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
12-22 16:08:42.120: E/AndroidRuntime(625): ... 5 more 
12-22 16:08:43.341: W/ActivityManager(77): Force finishing activity com.socialsober/.MainActivity 
12-22 16:08:43.341: W/WindowManager(77): Failure taking screenshot for (180x300) to layer 21010 
12-22 16:08:43.861: W/ActivityManager(77): Activity pause timeout for ActivityRecord{416f0a08 com.socialsober/.MainActivity} 
+0

有什麼問題? – RobinHood

+0

在運行該應用程序時,即使在填充列表之前,該應用程序也停止工作,應用程序停止工作。 –

+0

它給出了什麼錯誤,把你的日誌貓。 – RobinHood

回答