2014-12-03 1 views
0

너무 많은 시간 동안 같은 문제가 발생하여 왜 stackoverflow 커뮤니티에 물어 보지 못했습니다. 방향을 세로로 설정하면 트위터가 제대로 작동합니다. 비동기 호출 중에 전화를 가로로 돌리면 충돌이 발생합니다. 이 문제에 대한 몇 가지 예를 살펴본 결과 몇 가지를 시도해 보았습니다. 화면 잠금은 해결책이 아닙니다.
코드 스 니펫을 게시하려고합니다. 어쩌면 누군가가 나에게 팁을 줄 수 있습니다. 감사합니다Android 트위터 비동기 작업이 가로로 충돌 함

로그 캣 오류

12-03 16:43:01.650 18351-18351/com.example.admin.football E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at com.example.admin.football.fragments.TwitterFragment.onTaskFinished(TwitterFragment.java:94) 
      at com.example.admin.football.fragments.TwitterFragment$DownloadTwitterTask.onPostExecute(TwitterFragment.java:193) 
      at com.example.admin.football.fragments.TwitterFragment$DownloadTwitterTask.onPostExecute(TwitterFragment.java:171) 
      at android.os.AsyncTask.finish(AsyncTask.java:631) 
      at android.os.AsyncTask.access$600(AsyncTask.java:177) 
      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4797) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
      at dalvik.system.NativeStart.main(Native Method) 

자바 코드 :

public TwitterFragment() 
{ 
} 
@Override 
public void onTaskStarted() { 
    isTaskRunning = true; 
    load(listView); 
} 
// converts a string of JSON data into a Twitter object 
private Twitter jsonToTwitter(String result) { 
    Twitter twits = null; 
    if (result != null && result.length() > 0) { 
     try { 
      Gson gson = new Gson(); 
      twits = gson.fromJson(result, Twitter.class); 
     } catch (IllegalStateException ex) { 
      // just eat the exception 
     } 
    } 
    return twits; 
} 
@Override 
public void onTaskFinished(String result) { 
    if (spinner != null) { 
     final Twitter twits = jsonToTwitter(result); 
     if(twits!=null) { 

      // lets write the results to the console as well 
      for (Tweet tweet : twits) { 
       Log.i(LOG_TAG, tweet.getText()); 
      } 

      cardArrayAdapter = new CardArrayAdapter(getActivity().getApplicationContext(), R.layout.list_item_card); 
      for (int i = 0; i < twits.size(); i++) { 
       String dt = twits.get(i).getDateCreated(); 
       Card card = new Card(twits.get(i).getUser().getProfileImageUrl(), twits.get(i).getUser().getScreenName(), twits.get(i).toString(), dt.substring(0, 10)); 
       cardArrayAdapter.add(card); 

      } 
      listView.setAdapter(cardArrayAdapter); 
      /*cardArrayAdapter.getFilter().filter(Hashtag, new Filter.FilterListener() { 
       @Override 
       public void onFilterComplete(int count) { 
        listView.setAdapter(cardArrayAdapter); 
       } 
      });*/ 
      spinner.setVisibility(View.GONE); 
     } 
     spinner.setVisibility(View.GONE); 
    } 
    isTaskRunning = false; 
} 
@Override 
public void onDetach() { 
    // All dialogs should be closed before leaving the activity in order to avoid 
    // the: Activity has leaked window com.android.internal.policy... exception 
    if (spinner != null) { 
     spinner.setVisibility(View.GONE); 
    } 
    super.onDetach(); 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 
@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    // If we are returning here from a screen orientation 
    // and the AsyncTask is still working, re-create and display the 
    // progress dialog. 
    if (isTaskRunning) { 
     load(listView); 
    } 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 

    View rootView = inflater.inflate(R.layout.fragment_twitter, container, false); 
    listView = (ListView) rootView.findViewById(R.id.card_listView); 
    spinner = (ProgressBar)rootView.findViewById(R.id.progressBar1); 
    spinner.setVisibility(View.GONE); 
    listView.addHeaderView(new View(getActivity())); 
    listView.addFooterView(new View(getActivity())); 
    // call method to download tweets 
    downloadTweets(); 
    return rootView; 
} 
public void load(View view){ 
    spinner.setVisibility(View.VISIBLE); 
} 
// download twitter timeline after first checking to see if there is a network connection 
public void downloadTweets() { 
    ConnectivityManager connMgr = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 

    if (networkInfo != null && networkInfo.isConnected()) { 
     load(listView); 
     new DownloadTwitterTask(this).execute(ScreenName); 
    } else { 
     Log.v(LOG_TAG, "No network connection available."); 
    } 
} 


// Uses an AsyncTask to download a Twitter user's timeline 
//TODO cancel this when view is changed! 
public class DownloadTwitterTask extends AsyncTask<String, Void, String> { 
    private final TaskListener listener; 
    final static String CONSUMER_KEY = ""; 
    final static String CONSUMER_SECRET = ""; 
    final static String TwitterTokenURL = "https://api.twitter.com/oauth2/token"; 
    final static String TwitterStreamURL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name="; 
    public DownloadTwitterTask(TaskListener listener) { 
     this.listener = listener; 
    } 
    @Override 
    protected String doInBackground(String... screenNames) { 
     String result = null; 

     if (screenNames.length > 0) { 
      result = getTwitterStream(screenNames[0]); 
     } 
     return result; 
    } 

    // onPostExecute convert the JSON results into a Twitter object (which is an Array list of tweets 
    @Override 
    protected void onPostExecute(String result) { 
     listener.onTaskFinished(result); 

    } 

    // convert a JSON authentication object into an Authenticated object 
    private Authenticated jsonToAuthenticated(String rawAuthorization) { 
     Authenticated auth = null; 
     if (rawAuthorization != null && rawAuthorization.length() > 0) { 
      try { 
       Gson gson = new Gson(); 
       auth = gson.fromJson(rawAuthorization, Authenticated.class); 
      } catch (IllegalStateException ex) { 
       // just eat the exception 
      } 
     } 
     return auth; 
    } 
+0

logcat을 게시 할 수 있습니까? – TheRedFox

+0

안녕하세요, 방금 방금 소식을 업데이트했습니다. 그것이 도움이되기를 바랍니다 – youngcoder

+0

화면이 회전 할 때 활동이 다시 생성되기 때문에 활동이나 UI에 지루함을 느낍니다. 그 참조 중 하나가 null이 될 것이라고 생각합니다 – TheRedFox

답변

0

누군가가 준 잘 경우에도 해결책 n 더 나은 것을주고 싶다. configChanges을 사용하면 화면을 회전 할 때 리소스를 다시로드하지 않아도됩니다. 즉, 다른 레이아웃이나 다른 리소스를 사용하여 풍경과 포틀릿을 사용하는 경우 완전히 유용하지 않습니다. 조각에서 AsyncTask를 호출하고 setRetainInstance(true) 메서드 인 here을 사용하면 어떻게 수행해야하는지 잘 설명 할 수 있습니다.

+0

위대한 블로그, 그것은 내가 어떻게 일을하는지 이해하는 것을 도왔다. – youngcoder

+0

감사합니다. @youngcoder – TheRedFox

0

가 매니페스트에서 활동 항목에이 줄을 추가합니다 :

android:configChanges="layoutDirection|keyboardHidden|orientation|screenSize|screenLayout" 
+0

무언가가 일어 났을 때 활동이 복원되지 못하기 때문에 효과가 있지만 올바른 해결책이 아닙니다. @youngcoder – TheRedFox

+0

아, 제가 훨씬 더 우아한 방식으로 이것을 해결할 수 있다고 생각합니까? 익명 스레드에서 UI 물건을 호출하려고했지만 실패했습니다. @ TheRedFox – youngcoder

+0

@ TheRedFox 나는 이것이 왜 가장 좋은 해결책이라고 생각 하는가? –

관련 문제