2013-04-06 108 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