2015-01-13 2 views
0

AsyncTask가 모두 실행되기 전에 조각이 바뀝니다. 두 조각으로 응용 프로그램을 만들었습니다. 한 조각에서 나는 AsyncTask를 사용한다. 이 프로그램을 실행하고 조각을 빨리 바꿀 때 해당 응용 프로그램이 중지되었습니다.AsyncTask가 실행되기 전에 조각을 바꿉니다.

이 AsyncTask를를 사용하여 조각 1의 코드입니다

public class Fragment1 extends SherlockFragment { 

    EditText fragment1_edit_text; 
    Button fragment1_plus_button; 

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

     super.onCreateView(inflater, container,savedInstanceState); 
     View rootView = inflater.inflate(R.layout.fragment1, container, false); 
     fragment1_edit_text = (EditText) rootView.findViewById(R.id.fragment1EditText); 
     fragment1_plus_button = (Button) rootView.findViewById(R.id.fragment1PlusButton); 

     fragment1_plus_button.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        String link = "http://to.ly/api.php?longurl="; 
        String address = fragment1_edit_text.getText().toString(); 
        link += address; 
        new getResult().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,link); 
      } 
     }); 

     return rootView; 
    } 


    public class getResult extends AsyncTask<String, Void, String> { 
     String result = "fail"; 
     String link = ""; 

     @Override 
     protected String doInBackground(String... params) { 
      String link = params[0]; 
      return GetSomething(link); 
     } 

     final String GetSomething(String address) 
     { 
      try { 
       link = address; 
       URL url = new URL(link); 
       InputStream response = url.openStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(response)); 
       result = reader.readLine(); 
       reader.close();  
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return result; 
     } 

     protected void onPostExecute(String result){  
      addLink(new Link(link.substring(29)+":", result));  
     } 
    } 

    DatabaseHelper helper; 

    private void addLink(Link link){ 

     if(link.get_short_link().contains("http://to.ly/")){ 
      helper = OpenHelperManager.getHelper(getActivity(), DatabaseHelper.class); 
      RuntimeExceptionDao<Link, Integer> linkDao = helper.getLinkRuntimeExceptionDao(); 
      linkDao.create(link); 
      OpenHelperManager.releaseHelper(); 
      Toast.makeText(getActivity(),"Link has been added",Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(getActivity(),"Error, try change URL",Toast.LENGTH_LONG).show(); 
     } 
    } 

가 그리고 이것은 내 지식의 조각을

private void selectItem(int position) { 

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     if(position == 0) 
      ft.replace(R.id.content_frame, fragment_1); 
     else 
      ft.replace(R.id.content_frame, fragment_2); 
     ft.commit(); 

     drawer_list.setItemChecked(position, true); 
     if(position == 0) 
      setTitle("Fragment 1"); 
     else 
      setTitle("Fragment 2"); 

     drawer_layout.closeDrawer(drawer_list); 
    } 

나에게 용서해주세요 격차를 선택하는 것입니다, 저는 초보자입니다.

이 문제를 해결할 수 있습니까?

는 그리고이 얻을 :

01-14 07:29:38.335: D/AndroidRuntime(1813): Shutting down VM 01-14 07:29:38.335: D/AndroidRuntime(1813): --------- beginning of crash 01-14 07:29:38.335: E/AndroidRuntime(1813): FATAL EXCEPTION: main 01-14 07:29:38.335: E/AndroidRuntime(1813): Process: pl.nominalista.fragmentator, PID: 1813 01-14 07:29:38.335: E/AndroidRuntime(1813): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.widget.Toast.<init>(Toast.java:101) 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.widget.Toast.makeText(Toast.java:250) 01-14 07:29:38.335: E/AndroidRuntime(1813): at pl.nominalista.fragmentator.Fragment1.addLink(Fragment1.java:101) 01-14 07:29:38.335: E/AndroidRuntime(1813): at pl.nominalista.fragmentator.Fragment1.access$0(Fragment1.java:91) 01-14 07:29:38.335: E/AndroidRuntime(1813): at pl.nominalista.fragmentator.Fragment1$getResult.onPostExecute(Fragment1.java:81) 01-14 07:29:38.335: E/AndroidRuntime(1813): at pl.nominalista.fragmentator.Fragment1$getResult.onPostExecute(Fragment1.java:1) 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.os.AsyncTask.finish(AsyncTask.java:632) 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.os.AsyncTask.access$600(AsyncTask.java:177) 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.os.Handler.dispatchMessage(Handler.java:102) 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.os.Looper.loop(Looper.java:135) 01-14 07:29:38.335: E/AndroidRuntime(1813): at android.app.ActivityThread.main(ActivityThread.java:5221) 01-14 07:29:38.335: E/AndroidRuntime(1813): at java.lang.reflect.Method.invoke(Native Method) 01-14 07:29:38.335: E/AndroidRuntime(1813): at java.lang.reflect.Method.invoke(Method.java:372) 01-14 07:29:38.335: E/AndroidRuntime(1813): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 01-14 07:29:38.335: E/AndroidRuntime(1813): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

답변

0

조각의 onPause() 메소드를 재정의하고 asynctask를 취소하십시오.

다음과 같이 asynctask를 전역으로 선언하십시오.

getResult asyntask; 

다음과 같이 asynctask 호출을 호출 할 때.

asyntask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,link); 


@Override 
public void onPause() { 
    asyntask.cancel(true); 
} 

및 doInBackground() 메소드에서 취소를 계속 확인하십시오.

@Override 
    protected String doInBackground(String... params) { 
     String link = params[0]; 
     if (isCancelled()) break; 
     return GetSomething(link); 
    } 
+0

'@Override \t \t 보호 문자열 doInBackground (문자열 PARAMS ...) { \t \t \t 문자열 링크의 PARAMS = [0]; \t \t \t 경우 (의 isCancelled는()) { \t \t \t \t Toast.makeText (getActivity(), Toast.LENGTH_LONG을 "취소") .show(); \t \t \t \t return null; \t \t \t} \t \t \t return GetSomething (link); \t \t} ' 코드를 추가했는데 위 부분 만 변경하면 AsyncTask를 사용하여 조각을 빠르게 변경하면 응용 프로그램이 중지되는 오류가 발생합니다. –

+0

로그를 게시 할 수 있습니까? – EagleEye

+0

코드의 낡은 부분을 남겨두고 현재 작동 중이거나 오류가 느려집니다.) –

관련 문제