2013-02-25 67 views
0

下载什么我做的是下载文件的列表,用的AsyncTask每X秒:插座关闭 - 从API

首先获得的视频和图像的名单,然后我下载它们。一切都很完美。

package com.example.tvrplayer; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.content.Context; 
import android.os.AsyncTask; 
import android.util.Log; 

public class updateFiles extends AsyncTask<Object, Integer, Long> { 

    public PlayerActivity activity; 

    public updateFiles(PlayerActivity a) { activity = a;} 



    @Override 
    protected Long doInBackground(Object... params) { 
     Context context = (Context) params[0]; 
     String username = (String) params[1]; 
     String linkid = (String) params[2]; 
     String apiurl = (String) params[3]; 

     JSONArray programs = Json.getJson(apiurl + "/rest/program/device/"+ linkid +"/"+ username +"/"+ activity.deviceid, "GET"); 
     File mediadir = context.getDir("tvr", Context.MODE_PRIVATE); 
      try { 
       LINE 44- for (int j=0; j < programs.length(); j++) { 

        JSONObject json_data = programs.getJSONObject(j); 
        String name = json_data.getString("Name").toLowerCase(); 
        name = name.replace("-", "_"); 
        if (name.contains("mp4") || name.contains("m4v") || name.contains("png") || name.contains("jpg") || name.contains("jpeg")) { 
         String _name = name.replace("/", ""); 
         File file = new File(mediadir, _name); 
         Log.i("FILE SIZE", ""+file.length()); 
         if (file.length() > 0) { 
          Log.i("FILE EXISTS", _name); 
         } else { 
          Log.i("START DOWNLOAD", _name); 
          new Download().execute(context, _name, apiurl + "/rest/transfer/"+ linkid +"/"+ username +"/" + json_data.getString("ID")); 
         } 
         Log.i("FILES found", ""+mediadir.listFiles().length); 
        } 
       } 
     } catch (JSONException e) { 
      Log.e("JSON Exception", e.getMessage()); 
      e.printStackTrace(); 
     } 
//  activity.filelist = mediadir.listFiles(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Long result) {} 

} 

过了一会儿,我得到这个错误:

02-25 16:19:19.578: E/JSON - 2 -(17470): java.net.SocketException: Socket closed - http://192.168.2.136:8080/rest/program/device/123someasdidFoo123123/[email protected]/000 

02-25 16:19:16.648: W/dalvikvm(17284): threadid=11: thread exiting with uncaught exception (group=0x40bf11f8) 
02-25 16:19:16.664: E/AndroidRuntime(17284): FATAL EXCEPTION: AsyncTask #1 
02-25 16:19:16.664: E/AndroidRuntime(17284): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-25 16:19:16.664: E/AndroidRuntime(17284): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.lang.Thread.run(Thread.java:856) 
02-25 16:19:16.664: E/AndroidRuntime(17284): Caused by: java.lang.NullPointerException 
02-25 16:19:16.664: E/AndroidRuntime(17284): at com.example.tvrplayer.updateFiles.doInBackground(updateFiles.java:44) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at com.example.tvrplayer.updateFiles.doInBackground(updateFiles.java:1) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
02-25 16:19:16.664: E/AndroidRuntime(17284): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-25 16:19:16.664: E/AndroidRuntime(17284): ... 5 more 

这是从API

package com.example.tvrplayer; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.os.AsyncTask; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 

public class Json { 

    static JSONArray getJson(String url, String method) { 
     // Log.i("JSON",url); 

     InputStream is = null; 
     String result = ""; 
     JSONArray jsonObject = null; 

     // HTTP 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests! 
      if (method == "GET") { 
       HttpGet httpget = new HttpGet(url); 
       HttpResponse response = httpclient.execute(httpget); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
       if (entity != null) { 
        httpget.abort(); 
       } 
      } else if (method == "POST") { 
       HttpPost httppost = new HttpPost(url); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
      } 



     } catch(Exception e) { 
      Log.e("JSON - 1 -", e.toString()); 
      return null; 
     } 

     // Read response to string 
     try {   
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      result = sb.toString();  
//   Log.d("JSON result",result); 
     } catch(Exception e) { 
      Log.e("JSON - 2 -", e.toString() + " - " + url); 
      return null; 
     } 

     // Convert string to object 
     try { 
      jsonObject = new JSONArray(result);    
     } catch(JSONException e) { 
      try { 
       jsonObject = new JSONArray("["+result+"]");    
      } catch(JSONException e1) { 
       Log.e("JSON - 3 -", e1.toString()); 
       return null; 
      } 
     } 

     return jsonObject; 
    } 
} 

所以我所想象的情况是得到的东西JSON文件虽然asynctask正忙于下载另一个下载完成并关闭连接?

任何想法是什么或如何解决这个问题?

+0

什么是你的doInBackground()的第44行? – Budius 2013-02-25 14:35:58

+0

mm,它的for(int j = 0; j Harry 2013-02-25 14:39:21

+0

所以我可以安全地假设程序为null!你必须解决这个问题。 – Budius 2013-02-25 14:43:43

回答

1

您在doBackground()方法的第44行得到了Null Pointer Exception。请发布完整的代码,以便我们可以进一步帮助您。确保在使用任何对象之前完成所有初始化。在任何情况下,检查第44行,无论你在哪里使用哪个对象,都要确保它不为NULL。

+0

请更新我的更新,第44行标记为 – Harry 2013-02-25 14:43:49

+0

如果我删除此Log.e(“JSON - 2 - ”,e.toString()+“ - ”+ url); 返回null;它会继续,不会崩溃的应用程序。但我想这不是一个好主意? – Harry 2013-02-25 14:45:03

+0

'程序'为NULL。确保你正确地设置它。 JSON是否返回正确的值?还是它返回NULL? – h4ck3d 2013-02-25 14:45:19