0

我已经完成了以下代码来显示一个简单的 twitter 提要,但它出现了一个错误。可能是因为我在做片段,但我不确定。我遵循了一个关于如何创建 twitter 提要的教程,所以它应该可以工作,但我不知道。大家能找到问题吗?

package info.android.icecreamparties;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
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.app.Fragment;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class HomeFragment extends Fragment {

TextView tweetTextView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 

{


    View rootView = inflater.inflate(R.layout.fragment_home, container, false);

    TextView about = (TextView)rootView.findViewById(R.id.homepageintro);
    Typeface bb = Typeface.createFromAsset(getActivity().getAssets(), "BebasNeue.otf");
    about.setTypeface(bb);

    String twitterTimeline = getTwitterTimeline();
    try {
     String tweets = "";
     JSONArray jsonArray = new JSONArray(twitterTimeline);
     for (int i = 0; i < jsonArray.length(); i++) {
      JSONObject jsonObject = jsonArray.getJSONObject(i);
      int j = i + 1;
      tweets += "Tweet #" + j + " \n";
      tweets += "Date:" + jsonObject.getString("created_at") + "\n";
      tweets += "Post:" + jsonObject.getString("text") + "\n\n";
     }
     tweetTextView = (TextView)rootView.findViewById(R.id.twitterfeed);
     tweetTextView.setText(tweets);
    } catch (JSONException e) {
     e.printStackTrace();
    }
    return rootView;
   }

   public String getTwitterTimeline() {
    StringBuilder builder = new StringBuilder();
    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(
      "http://api.twitter.com/1/statuses/user_timeline/BBCNews.json?count=10&include_rts=1&callback=?");
    try {
     HttpResponse response = client.execute(httpGet);
     StatusLine statusLine = response.getStatusLine();
     int statusCode = statusLine.getStatusCode();
     if (statusCode == 200) {
      HttpEntity entity = response.getEntity();
      InputStream content = entity.getContent();
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(content));
      String line;
      while ((line = reader.readLine()) != null) {
       builder.append(line);
      }
     } else {
      // Display couldn't obtain the data from twitter
     }
    } catch (ClientProtocolException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }
    return builder.toString();
   }

}
4

4 回答 4

1

您需要调用getTwitterTimeline非 UI 线程。AsyncTask从 a或 a调用它Loader。类似的东西(记事本++中的盲代码):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.fragment_home, container, false);
    TextView about = (TextView)rootView.findViewById(R.id.homepageintro);
    Typeface bb = Typeface.createFromAsset(getActivity().getAssets(), "BebasNeue.otf");
    about.setTypeface(bb);
    new AsyncTask<Void, Void, String>() {
        public String doInBackground(Void ... params) {
            return getTwitterTimeline();
        }
        protected void onPostExecute(String twitterTimeline) {
            try {
                String tweets = "";
                JSONArray jsonArray = new JSONArray(twitterTimeline);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    int j = i + 1;
                    tweets += "Tweet #" + j + " \n";
                    tweets += "Date:" + jsonObject.getString("created_at") + "\n";
                    tweets += "Post:" + jsonObject.getString("text") + "\n\n";
                }
                TextView tweetTextView = (TextView)rootView.findViewById(R.id.twitterfeed);
                tweetTextView.setText(tweets);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }.execute();
    return rootView;
}
于 2014-02-04T21:46:52.667 回答
0

您正在将网络通信放在主线程上。你不被允许这样做。您可以使用 AsyncTask

http://developer.android.com/reference/android/os/AsyncTask.html 

只是为了测试,您可以在 Main Activity 中添加以下内容,但这被认为是不好的做法。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
于 2014-02-04T21:55:20.310 回答
0

您需要在另一个线程中运行 getTwitterTimeline。我建议在 onCreateView() 中创建一个 AsyncTask。您得到的例外是因为在您等待 twitter 回复时无法绘制 UI。因此,“主线程上的网络”问题。

看这里:

http://developer.android.com/reference/android/os/AsyncTask.html

于 2014-02-04T21:47:21.083 回答
0

使用AsyncTask类来获取您的推特数据,您不能使用 UI 线程从网络获取数据。

于 2014-02-04T21:47:22.863 回答