나는 안드로이드 애플 리케이션 개발의 초보자입니다. 내 안드로이드 앱에 트윗을 읽으려고합니다. TwitterAsyncTask를 사용하여 (이 모든 것을 책에서 배운다). 하지만 앱을 실행 한 후에 앱 강제 종료됩니다. 내가 잘못하고있는 게 뭐지? 강제로 닫히는 오류를 알 수있는 방법은 무엇입니까?트위터 API가있는 Android 앱에 트윗을 올리기 - 강제 종료
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 (30,861) DexOpt : 불법 액세스 방법 (전화 Landroid/콘텐츠/입술 /하는 TypedArray ;. (Landroid/콘텐츠/입술/자원; 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 ;. VFY : 0x000에서 opcode 0x70 바꾸기 07-15 23 : 24 : 22.978 : I (Void) : VFY : 0x0002에서 opcode 0x70 대체 07-15 23 : 24 : 22.708 : D/dalvikvm (30861)/Adreno-EGL (30861) : : EGL 1.4 QUALCOMM 빌드 : I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate : 11/06/13 07-15 23 : 24 : 23.008 : D/OpenGLRenderer (30861) : 디버그 모드 사용 0 07-15 23:24 : 23 : 24 : 23.018 : E/AndroidRuntime (30861) : 비동기 예외 (그룹 = 0x415dfc68)로 종료하는 스레드 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : 비동기 태스크 # 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 (3086) 1) : android.os.AsyncTask $ 3.done (AsyncTask.java:300) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.util.concurrent.FutureTask.finishCompletion (FutureTask.java : 355) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.util.concurrent.FutureTask.setException (FutureTask.java:222) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.util.concurrent.FutureTask.run (FutureTask.java:242) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : android.os.AsyncTask $ SerialExecutor $ 1.run ((ThreadPoolExecutor.java:1131) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.lang.Thread.run (Thread.java:841) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : 원인 : java.lang.SecurityException : 사용 권한 (인터넷 주소가 누락되었습니다.) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.net.InetAddress.lookupHostByName (InetAddress.java:418) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.net.InetAddress.getAllByNameImpl (InetAddress.java:236) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : java.net.InetAddress.getAllByName (InetAddress.java) : 214) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection (DefaultClientConnectionOperator.java:137) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:164)) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : org.apache.http.impl.conn.AbstractPooledConnAdapter.open (AbstractPooledConnAdapter.java:119) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : org.apache.http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector.java:360) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : org.apache.http .impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:555) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java) : 487) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:465) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : com.balani.fetchtweets.MainActivity에서 $ TwitterAsyncTask.getURLContents (MainActivity.java : 71) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : com.balani.fetchtweets.MainActivity $ TwitterAsyncTask.doInBackground (MainActivity.java:57) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : 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) : java.util.concurrent.FutureTask.run (FutureTask.java:237) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : ... 자세히 알아보기 07-15 23 : 24 : 23.018 : E/AndroidRunt ime (30861) : 원인 : libcore.io.GaiException : getaddrinfo 실패 : EAI_NODATA (호스트 이름과 연관된 주소 없음) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : libcore.io.Posix.getaddrinfo (네이티브 메소드) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : libcore.io.ForwardingOs.getaddrinfo (ForwardingOs.java:61) 07-15 23 : 24 : 23.018 : E/AndroidRuntime 30861) : java.net.InetAddress.lookupHostByName (InetAddress.java:405) 07-15 23 : 24 : 23.018 : E/AndroidRuntime (30861) : ... 자세히 ... 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
후 로그 캣 예외에 응용 프로그램 태그 외부
:
는이 라인을 추가해야합니다. –
나는 이것이 당신이 말한 것이기를 바랍니다. – TheOddAbhi
예, 아래 답변을 참조하십시오. –