2015-01-22 1 views
0

Я пытаюсь получить объект stringBuilder для моего основного действия. Я проверяю мой json-файл или коды синтаксического анализа, они хорошо работают. Однако, когда я пытаюсь получить stringbuilder, он дал ошибку: Ресурс был получен при подключенной трассировке стека, но не был выпущен. См. Java.io.Closeable для получения информации об избежании утечки ресурсов. java.lang.Throwable: Явный метод прекращения 'закрыть' не называетсяКак передать строку в android без ошибки. Ресурс был получен при прикрепленной трассировке стека, но никогда не был выпущен.

код Server.java как ниже

`

public class Server extends Activity { 

    static StringBuilder stringBuilder = new StringBuilder(); 
public Server(){ 
    try { 
     JSONObject obj = new JSONObject(loadJSONFromAsset()); 
     JSONArray project = obj.getJSONArray("project"); 

     for (int i = 0; i < project.length(); i++) { 
      JSONObject ss = project.getJSONObject(i); 
      stringBuilder.append(ss.getString("title") + "\n"); 
      JSONArray post = ss.getJSONArray("posts"); 

      for(int j = 0; j < post.length();j++){ 
       JSONObject posts = post.getJSONObject(j); 
       stringBuilder.append(posts.getString("id") +"\n"); 
       JSONArray tag = posts.getJSONArray("tags"); 

       for(int k = 0; k < tag.length();k++){ 
        stringBuilder.append(tag.getString(k) +"\n"); 
       } 
      } 
     } 
    } 
    catch (JSONException e) { 
     stringBuilder.append("error"); 
     e.printStackTrace(); 
    } 

} 

public String getString(){ 

    return stringBuilder.toString(); 
} 


public String loadJSONFromAsset() { 
    String json = null; 
    try { 

     InputStream is = getAssets().open("cat.json"); 
     int size = is.available(); 
     byte[] buffer = new byte[size]; 
     is.read(buffer); 
     is.close(); 
     json = new String(buffer, "UTF-8"); 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
     return null; 
    } 
    return json; 
}} 

и вот мой MainActivity.java

public class MainActivity extends Activity { 


TextView jsonDataTextView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    jsonDataTextView = (TextView) findViewById(R.id.textView); 

    Server s = new Server(); 
    jsonDataTextView.setText(s.stringBuilder.toString());} } 

Есть ли решение?

+2

Я не проверял это сам, но я предполагаю, что вы закрываете поток ввода/вывода в блок 'try'. Если возникает исключение, поток не закрывается. Вы должны попытаться добавить блок 'finally' и внутри него, напишите' is.close(); '. –

+2

Почему ваш серверный класс расширяет Activity? – Gorcyn

+0

getAssets хочет это @Gorcyn –

ответ

2

InputStream не может быть закрыт в блоке try вашего метода loadJSONFromAsset, и он должен.

public String loadJSONFromAsset() { 
    String json = null; 
    InputStream is = null; 
    try { 
     is = getAssets().open("cat.json"); 
     int size = is.available(); 
     byte[] buffer = new byte[size]; 
     is.read(buffer); 
     json = new String(buffer, "UTF-8"); 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } 
      catch (IOException ex) { 
       // Do you want to handle this exception? 
      } 
     } 
    } 
    return json; 
} 

Примечание: Что-то беспокоит меня в Server конструктор, в catch блоке вы пытаетесь добавить «ошибку» в вашем StringBuilder. Знаете ли вы, что здесь StringBuilder может быть пустым. Действительно, в блоке try одна (или более) попытка (ы) добавить некоторую строку к ней может работать, прежде чем что-то пойдет не так в какой-то момент.

Примечание 2: Сервер как не активность

public class Server { 

    private Context mContext; 
    public Server(Context context) { 
     mContext = context; 
     ... 
    } 
    ... 
    public String loadJSONFromAsset() { 
     ... 
      mContext.getAssets().open("cat.json"); 
    } 
} 

затем в вашем MainActivity

Server s = new Server(this); 
+0

Когда я пытаюсь поставить is.close(); в итоге он дал ошибку, а public String loadJSONFromAsset() нуждается в выбросе IOException. Когда это было теперь JSONObject obj = новый JSONObject (loadJSONFromAsset()); дал ошибку, и мне нужен catch (IOException e) { e.printStackTrace(); } после этого, когда я запускаю его, он продолжает продолжать выдавать ошибку. –

+0

Отредактировано. Это уродливо, я знаю ... но вы увидите много обработки исключений в блоках 'finally', когда вы погрузитесь в потоки ввода-вывода. Проверьте это: http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/IOUtils.java#IOUtils.closeQuietly%28java. io.InputStream% 29 – Gorcyn

+0

Вчера я работал над ним 8 часов. Спасибо, Горцин сейчас работает. Однако я не могу понять, что такое контекст. Можете ли вы объяснить кратко. –

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

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