2013-04-06 44 views
0

我目前正在嘗試DL一些Twitter信息,由於某些原因我使用的代碼不會返回數據。使用Android連接到Twitter

當我在資源管理器中手動使用URL時,我確實獲取了數據。但是當我嘗試讓Android來做到這一點時,我得到了一個異常。

我發現了兩種試圖獲取數據的方法。第一個如圖所示。第二個是評論註釋上方的三行,並取消註釋其他行。

以後我會使用JSON來解析字符串。

我希望我已經充分解釋了我的問題。任何意見將受到歡迎。

import java.io.InputStream; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 

public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    String searchUrl = "http://search.twitter.com/[email protected]&rpp=100&page=1"; 


    HttpClient client = new DefaultHttpClient(); 
    HttpGet get = new HttpGet(searchUrl); 

    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 

    String responseBody = null; 
    Log.d("log", "test"+responseBody); 
    try{ 
     responseBody = client.execute(get, responseHandler); 
     HttpResponse response = client.execute(get); 
     responseBody = response.toString(); 


//   HttpResponse response = client.execute(get); 
//   InputStream inputStream = response.getEntity().getContent(); 
//   responseBody = inputStream.toString(); 

     Log.d("log", "test2"+responseBody); 

    }catch(Exception ex) { 
     Log.d("log", "nope"); 
     ex.printStackTrace(); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 


} 
+0

什麼是例外? – 2013-04-06 21:07:24

回答

1

我不知道你的異常是什麼,但你的第一個問題可能是,你在主線程上做網絡活動。你必須啓動一個新線程或使用Async Task

你的第二個問題是你不正確地將響應轉換爲字符串。要獲取實際的內容字符串,您必須遍歷InputStream。 This is my preferred method

此外,請確保<uses-permission android:name="android.permission.INTERNET" />在您的AndroidManifest.xml文件中。

嘗試了這一點:

import java.io.InputStream; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     (new Thread(new Runnable() { 

      @Override 
      public void run() { 
       String searchUrl = "http://search.twitter.com/[email protected]&rpp=100&page=1"; 
       HttpClient client = new DefaultHttpClient(); 
       HttpGet get = new HttpGet(searchUrl); 

       String responseBody = null; 
       Log.d("log", "test" + responseBody); 
       try { 
        HttpResponse response = client.execute(get); 
        InputStream inputStream = response.getEntity().getContent(); 
        // responseBody = inputStream.toString(); 
        responseBody = streamToString(inputStream); 

        Log.d("log", "test2" + responseBody); 

       } catch (Exception ex) { 
        Log.d("log", "nope"); 
        ex.printStackTrace(); 
       } 

      } 
     })).start(); 
    } 

    public static String streamToString(InputStream is) { 
     java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
     return s.hasNext() ? s.next() : ""; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 
+0

所以。我的整個問題都不是代碼,而是它的放置位置?最終,它應該被添加到我將要使用的服務中,但我試圖對它進行測試,只是爲了讓它返回數據並對其進行解析。由於我從來沒有做過任何關於使用URL的事情,所以我想在將它添加到我的實際項目之前確保它可以正常工作。似乎有點愚蠢,我不能在像上面那樣的空白項目中運行基本請求,以便驗證我所做的事情是否浪費時間。 – 2013-04-08 22:24:47