2014-07-15 4 views
-1

나는 안드로이드 애플 리케이션 개발의 초보자입니다. 내 안드로이드 앱에 트윗을 읽으려고합니다. 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

+0

후 로그 캣 예외에 응용 프로그램 태그 외부

<uses-permission android:name="android.permission.INTERNET" /> 

:

는이 라인을 추가해야합니다. –

+0

나는 이것이 당신이 말한 것이기를 바랍니다. – TheOddAbhi

+0

예, 아래 답변을 참조하십시오. –

답변

1
Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?) 

는 매니페스트 파일에 INTERNET 권한을 추가합니다. 또한 AndroidManifest.xml

+0

고마워요. 네, 강제 폐쇄 문제를 해결했습니다. 그러나 트윗은 나타나지 않습니다. : – TheOddAbhi

+0

@ 아비 나는 트위터 API에 익숙하지 않아 새로운 질문으로 문제를 게시한다. –

+0

그래, 고마워! – TheOddAbhi