我是Android App Development的初学者。我正在尝试阅读我的Android应用程序的推文。使用TwitterAsyncTask(从书中学习所有这些)。但是在我启动它之后app力就会关闭。我做错了什么?我怎么知道导致力量的错误呢?
package com.balani.fetchtweets;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URL;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
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.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
private TwitterAsyncTask twitterFetcher;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListAdapter adapter = new TwitterJSONAdapter();
setListAdapter(adapter);
twitterFetcher = new TwitterAsyncTask();
twitterFetcher.execute("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=abhibalani&count=20");
}
private class TwitterAsyncTask extends AsyncTask<String, Integer, JSONArray>{
private final URI URL = null;
@Override
protected JSONArray doInBackground(String... params) {
String response = getURLContents(params[0]);
try {
return new JSONArray(response);
} catch (JSONException ex) { return null; }
}
private String getURLContents(String string) {
// TODO Auto-generated method stub
String xml = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(string);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return xml;
}
@Override
protected void onPostExecute(JSONArray response){
if(response == null)
return;
try{
((TwitterJSONAdapter)getListAdapter())
.setData(response);
getListView().setVisibility(View.VISIBLE);
View loading = findViewById(R.id.loading_text);
if(loading!=null)
loading.setVisibility(View.GONE);
}catch(Exception e){
Log.e("TwitterFeed","Failed to set Adapter");
}
}
}
private class TwitterJSONAdapter extends BaseAdapter {
JSONArray data;
//Must be called on the main thread
private void setData(JSONArray data){
this.data = data;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if(data==null)
return 0;
else
return data.length();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
if(data==null)
return null;
try{
JSONObject element = (JSONObject)data.get(position);
return element;
}catch(Exception e){
return null;
}
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
JSONObject node = (JSONObject)getItem(position);
ViewGroup listView = null;
//Reduce, Reuse, Recycle!
if(convertView == null)
listView =
(ViewGroup)getLayoutInflater().inflate
(R.layout.twitter_list_item, null);
else
listView = (ViewGroup)convertView;
try{
boolean retweeted = node.getInt("retweet_count") > 0;
TextView tv =(TextView)listView.findViewById(R.id.text_one);
tv.setText(node.getString("text"));
if(retweeted)
tv.setTextColor(0xFFFF0000);
else
tv.setTextColor(0xFFFFFFFF);
tv = (TextView)listView.findViewById(R.id.text_two);
tv.setText(node.getString("created_at"));
if(retweeted)
tv.setTextColor(0xFFFF0000);
else
tv.setTextColor(0xFFFFFFFF);
}catch(JSONException e){
Log.e("TwitterView","Failed to set list item",e);
}
return listView;
}
}
}
07-15 23:24:22.708:I / dalvikvm(30861):DexOpt:非法方法访问(调用Landroid / content / res / TypedArray ;.(Landroid / content / res / Resources; [I [II] V来自Landroid / content / res / XResources $ XTypedArray;) 07-15 23:24:22.708:I / dalvikvm(30861):找不到方法android.content.res.TypedArray。,从方法android.content.res.XResources $ XTypedArray中引用。 07-15 23:24:22.708:W / dalvikvm(30861):VFY:无法解析直接方法82:Landroid / content / res / TypedArray;。 (Landroid /内容/ RES /资源; [I [II)V 07-15 23:24:22.708:D / dalvikvm(30861):VFY:在0x0002处替换操作码0x70 07-15 23:24:22.978:I / Adreno-EGL(30861):: EGL 1.4 QUALCOMM Build:I0404c4692afb8623f95c43aeb6d5e13ed4b30ddb日期:11/06/13 07-15 23:24:23:008:D / OpenGLRenderer(30861):启用调试模式0 07-15 23:24:23.008:W / dalvikvm(30861):threadid = 11:线程退出时未捕获异常(group = 0x415dfc68) 07-15 23:24:23.018:E / AndroidRuntime(30861):致命异常:AsyncTask#1 07-15 23:24:23.018:E / AndroidRuntime(30861):进程:com.balani.fetchtweets,PID:30861 07-15 23:24:23.018:E / AndroidRuntime(30861):java.lang.RuntimeException:执行doInBackground()时发生错误 07-15 23:24:23.018:E / AndroidRuntime(30861):在android.os.AsyncTask $ 3.done(AsyncTask.java:300) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.run(FutureTask.java:242) 07-15 23:24:23.018:E / AndroidRuntime(30861):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.lang.Thread.run(Thread.java:841) 07-15 23:24:23.018:E / AndroidRuntime(30861):引起:java.lang.SecurityException:权限被拒绝(缺少INTERNET权限?) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.lookupHostByName(InetAddress.java:418) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.getAllByName(InetAddress.java:214) 07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 07-15 23:24:23.018:E / AndroidRuntime(30861):at com.balani.fetchtweets.MainActivity $ TwitterAsyncTask.getURLContents(MainActivity.java:71) 07-15 23:24:23.018:E / AndroidRuntime(30861):at com.balani.fetchtweets.MainActivity $ TwitterAsyncTask.doInBackground(MainActivity.java:57) 07-15 23:24:23.018:E / AndroidRuntime(30861):at com.balani.fetchtweets.MainActivity $ TwitterAsyncTask.doInBackground(MainActivity.java:1) 07-15 23:24:23.018:E / AndroidRuntime(30861):在android.os.AsyncTask $ 2.call(AsyncTask.java:288) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.run(FutureTask.java:237) 07-15 23:24:23.018:E / AndroidRuntime(30861):......还有4个 07-15 23:24:23.018:E / AndroidRuntime(30861):引起:libcore.io.GaiException:getaddrinfo失败:EAI_NODATA(没有与主机名关联的地址) 07-15 23:24:23.018:E / AndroidRuntime(30861):at libcore.io.Posix.getaddrinfo(Native Method) 07-15 23:24:23.018:E / AndroidRuntime(30861):at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61) 07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.lookupHostByName(InetAddress.java:405) 07-15 23:24:23.018:E / AndroidRuntime(30861):... 18更多 07-15 23:24:23.018:E / AndroidRuntime(30861):引起:libcore.io.ErrnoException:getaddrinfo失败:EACCES(权限被拒绝) 07-15 23:24:23.018:E / AndroidRuntime(30861):... 21更多 07-15 23:24:25.128:I / Process(30861):发送信号。 PID:30861 SIG:9
答案 0 :(得分:1)
Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
将INTERNET权限添加到清单文件中。
你必须添加这一行:
<uses-permission android:name="android.permission.INTERNET" />
AndroidManifest.xml