节约

2012-02-26 51 views
0

嘿家伙和女孩我有这样的代码,应该下载一个JSON对象,然后将其保存到内存中,我不断收到困在这里节约

try{ 
     //connects to mySQL 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://10.0.2.2/textures_story_list.php"); 
     HttpResponse response = client.execute(post); 
     //captures the response 
     entity = response.getEntity(); 
    }catch(Exception e) { 
     Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 
    try{ 
     is = entity.getContent(); 
     String FILENAME = "story.json"; 
     //gives file name 
     FileOutputStream output = openFileOutput(FILENAME, MODE_WORLD_READABLE); 
     //creates new StreamWriter 
     OutputStreamWriter writer = new OutputStreamWriter(output); 
     //writes json with file name story.json 
     writer.write(is); 
     writer.flush(); 
     //closes writer 
     writer.close(); 

    }catch(Exception e) { 
     Log.e("log_tag", "Error saving string "+e.toString()); 
    } 

一个JSON文件到内存中我不断获取误差修改writer.write(是); eclipse让我把它改为int,那么从线上编码的最好方法是什么

entity = response.getEntity(); 

???

这里是我的全部代码

public class MainActivity extends Activity { 

String storyObj = ""; 
Object json = null; 
HttpEntity entity = null; 
InputStream is = null; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    //button that saves the file from mySQL 
    Button save = (Button) findViewById(R.id.downloadBtn); 
    save.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      saveJson();    
     } 
    }); 

    //Button that opens the file from InternalMemory 
    Button open = (Button) findViewById(R.id.showBtn); 
    open.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      openJson();    
     } 
    }); 


//end of onCreate() 
} 


//saveJson pull a JSON file from mySQl server then saves that file in its JSON type eg .json 
public void saveJson(){ 
    TextView test = (TextView) findViewById(R.id.showView); 


    try{ 
     //connects to mySQL 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://10.0.2.2/textures_story_list.php"); 
     HttpResponse response = client.execute(post); 
     //captures the response 
     entity = response.getEntity(); 
    }catch(Exception e) { 
     Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 
    try{ 
     is = entity.getContent(); 
     String FILENAME = "story.json"; 
     //gives file name 
     FileOutputStream output = openFileOutput(FILENAME, MODE_WORLD_READABLE); 
     //creates new StreamWriter 
     OutputStreamWriter writer = new OutputStreamWriter(output); 
     //writes json with file name story.json 
     writer.write(is); 
     writer.flush(); 
     //closes writer 
     writer.close(); 

    }catch(Exception e) { 
     Log.e("log_tag", "Error saving string "+e.toString()); 
    } 

//end of saveJson() 
} 

private char[] Object(Object json2) { 
    // TODO Auto-generated method stub 
    return null; 
} 


public void openJson(){ 
    TextView test = (TextView) findViewById(R.id.showView); 



    try{ 
     FileInputStream fileInput = openFileInput("story.json"); 

     BufferedReader inputReader = new BufferedReader(new InputStreamReader(fileInput, "UTF-8"), 8); 
     StringBuilder strBuilder = new StringBuilder(); 
      String line = null; 
      while ((line = inputReader.readLine()) != null) { 
       strBuilder.append(line + "\n"); 
      } 
      fileInput.close(); 
      storyObj = strBuilder.toString(); 

    }catch(IOException e){ 
     Log.e("log_tag", "Error building string "+e.toString()); 
    } 

    try{ 
     JSONArray jArray = new JSONArray(storyObj); 
     String storyNames = ""; 
     for(int i = 0;i<jArray.length();i++){ 
      storyNames += jArray.getJSONObject(i).getString("story_name") +"\n"; 
     } 
     test.setText(storyNames); 

    }catch(JSONException e) { 
     Log.e("log_tag", "Error returning string "+e.toString()); 
    } 
    return; 
//and of openJson() 
} 




//end of class body  
} 

希望你能帮助我,已经这么长时间来得到它的工作!

添加从鲍里斯额外的代码...这是在那里我把代码?

try{ 
     //connects to mySQL 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://10.0.2.2/textures_story_list.php"); 
     HttpResponse response = client.execute(post); 
     //captures the response 
     entity = response.getEntity(); 
     InputStream entityStream = entity.getcontent(); 
     StringBuilder entityStringBuilder = new StringBuilder(); 
     byte [] buffer = new byte[1024]; 
     int bytesReadCount; 
     while ((bytesReadCount = entityStream(read(buffer)) > 0)) { 
      entityStringBuilder.append(new String(buffer, 0, bytesReadCount)); 
     } 
     String entityString = entityStringBuilder.toString(); 
     Integer responseInteger = Integer.valueOf(entityString); 
    }catch(Exception e) { 
     Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 

如果我得到一个错误上阅读

+0

凡/你怎么声明'is'对象? – bdares 2012-02-26 08:22:08

+0

上面的onCreate()与InputStream is = null; – daniel 2012-02-26 08:23:22

+0

是吗? – daniel 2012-02-26 08:23:29

回答

2

这是奇怪的情况,我编辑我以前的答案来解决你的这个问题。然而:另一个问题被问到,所以这里是我的这部分previous answer

关于你得到的错误 - 你试图将响应的实体直接转换为整数。这总是会失败,因为Integer不是HttpEntity的超类。你需要阅读的实体的内容在String,然后解析字符串的内容到整数:

InputStream entityStream = entity.getcontent(); 
StringBuilder entityStringBuilder = new StringBuilder(); 
byte [] buffer = new byte[1024]; 
int bytesReadCount; 
while ((bytesReadCount = entityStream.read(buffer)) > 0) { 
    entityStringBuilder.append(new String(buffer, 0, bytesReadCount)); 
} 
String entityString = entityStringBuilder.toString(); 
writer.wrtie(entityString); 

这不是高度优化的,但做这项工作。从此,您可以随意使用responseInteger值。但是,如果你想要做writer.write,你将需要String值,而不是Integer。因此我建议您使用entityString

+0

boris我添加了代码到我的问题是这写?我做了什么? – daniel 2012-02-26 08:40:57

+0

是的,你可以这样做没问题。你也可以做到这一点insetad行 尝试 { 是= entity.getContent的(); //这一行。 – 2012-02-26 08:44:05

+0

boris如何在阅读时发生错误? – daniel 2012-02-26 08:51:07

3

试试这个代码

package com.android.test.CacheDemo; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class CachingDemoActivity extends Activity implements OnClickListener{ 
    private static String URL="http://bhaskar1.cntdy.mobi/punjabkesari/appdetails/sectiondetails.json"; 
    private static String FILE_NAME = "CachedResponse"; 
    private Button startAPICallButton; 
    private Button retrieveFromCacheButton; 

    /* view lifecycle methods*/ 
     @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     this.initializeComponents(); 
    } 
    /*overriden methods*/ 
    public void onClick(View clickedView) 
    { 
     if(clickedView == this.startAPICallButton) 
     { 
      Toast.makeText(this, "Making the API call... Please wait", Toast.LENGTH_LONG).show(); 
      this.makeAPICall(); 
     } 
     else if(clickedView == this.retrieveFromCacheButton) 
     { 
      Toast.makeText(this, "Retrieving data from the fuckin cache!!!", Toast.LENGTH_LONG).show(); 
      this.retrieveStuffFromCache(); 
     } 
    } 
    /* private methods*/ 
    private void initializeComponents() 
    { 
     this.startAPICallButton = (Button) this.findViewById(R.id.start_api_call_button); 
     this.startAPICallButton.setOnClickListener(this); 
     this.retrieveFromCacheButton = (Button) this.findViewById(R.id.retrieve_cache_button); 
     this.retrieveFromCacheButton.setOnClickListener(this); 
    } 
    private void makeAPICall() 
    { 
     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       try 
       { 
        //download the json onto the device. 
        URL url = new URL(CachingDemoActivity.URL); 
        URLConnection connection = url.openConnection(); 
        //read the data and store it in a byte array first. 
        //dont use this code for big json file 
        //as long as its a json and not very long, this will work just fine!!! 
        InputStream inStream = connection.getInputStream(); 
        ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 
        int readByte = 0; 
        //read the bytes one-by-one from the inputstream to the buffer. 
        while(true) 
        { 
         readByte = inStream.read(); 
         if(readByte == -1) 
         { 
          break; 
         } 
         byteOutStream.write(readByte); 
        } 
        byteOutStream.flush(); 
        inStream.close(); 
        byteOutStream.close(); 
        byte[] response = byteOutStream.toByteArray(); 
        //now response byte array is the complete json in the biary form. We will save this stuff to file. 
        File cacheDir = CachingDemoActivity.this.getCacheDir(); 
        File jsonFile = new File(cacheDir, FILE_NAME); 
        FileOutputStream outStream = new FileOutputStream(jsonFile); 
        //write the whole data into the file 
        for(int i = 0; i < response.length; i++) 
        { 
         outStream.write(response[i]); 
        } 
        android.util.Log.e("status - ","API call is complete!!"); 
        //this should do the trick of saving all the stuff in the file with file name CachedResponse!! 
        //let see if we can retrieve the stuff!!! 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

    private void retrieveStuffFromCache() 
    { 
     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       try 
       { 
        File jsonFile = new File(CachingDemoActivity.this.getCacheDir(), FILE_NAME); 
        FileInputStream fInStream = new FileInputStream(jsonFile); 
        ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 
        int readByte = 0; 
        while(true) 
        { 
         readByte = fInStream.read(); 
         if(readByte == -1) 
         { 
          break; 
         } 
         byteOutStream.write(readByte); 
        } 
        fInStream.close(); 
        byteOutStream.flush(); 
        byteOutStream.close(); 
        byte[] retrievedStringData = byteOutStream.toByteArray(); 
        String originalJson = new String(retrievedStringData); 
        android.util.Log.e("json - ", originalJson); 
       } 
       catch(Exception ex) 
       { 
        ex.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
}