2017-11-11 8 views
0

저는이 개념을 처음 사용합니다. 여러 스레드를 읽었지만 인내심을 미리 감사드립니다!조각과 비동기 작업 간의 통신 코딩 관련 문제

조각 (frag1)에서 비동기 작업을 시작합니다. 작업이 완료되지 않은 상태에서 사용자가 아무 것도하지 못하게하여 완료된 작업의 %를 전달하여 사용자가 정보를 기다릴 수있게하려는 것입니다.

나는 자바 SetVal.java의 인터페이스를 정의했습니다 :

interface SetVal { 
    void setVal(int val); 
} 

내 비동기 작업을 : 나는 작업에 인터페이스를 전달하는 방법을 알고 사투를 벌인거야

class AsyncCounter extends AsyncTask<Void, Integer, Void> { 
    private SetVal sender; 

    public AsyncCounter(SetVal sv){ 
     this.sender = sv; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     for(int i=0;i<60;i++){ 
      publishProgress(i); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Log.i("ASYNC TASK","val: "+values[0]); 
     sender.setVal(values[0]); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
    } 

    public interface SetVal { 
     public void setVal(int val); 
    } 


    public void setListener(SetVal listener) { 
     this.sender = listener; 
    } 
} 

. 내 코드가 맞습니까? 비동기 작업을 어떻게 인스턴스화합니까?

조각 :

public class Frag1 extends android.app.Fragment implements SetVal { 
    private static TextView txt; 
    private int counter; 
    SetVal listener; 

    public Frag1() { 
     // Required empty public constructor 
    } 


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

     return inflater.inflate(R.layout.fragment_frag1, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     txt = (TextView) getActivity().findViewById(R.id.txt); 
     Button btn = (Button) getActivity().findViewById(R.id.btn1); 
     btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Log.i("Frag1", "val: " + counter); 
       if (counter > 0) return; 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       Frag2 f2 = new Frag2(); 
       ft.replace(R.id.content_frame, f2); 
       ft.addToBackStack("f2"); 
       ft.commit(); 
      } 
     }); 

     Button btn2 = (Button) getActivity().findViewById(R.id.btn2); 
     btn2.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       AsyncCounter ac = new AsyncCounter(???????); 
       ac.execute(); 
      } 
     }); 

    } 

    @Override 
    public void setVal(int val) { 
     counter = val; 
    } 
} 

답변

0

왜 그렇게하려고하지만, 당신이 조각 통과 할 수 무엇 확실하지 :

public void onClick(View v) { 
    startMyAsync(); 
} 

private void startMyAsync() { 
    new AsyncCounter(this).execute(); 
} 

:

보십시오 개인 방법을 만들 수를 마침내 :

public AsyncCounter(Frag1 context){ 
    this.sender = (SetVal)context; 
} 
+0

MyActivity is no 해결되었으므로 Context로 시도했지만 java.lang.ClassCastException이 손상되었습니다. com.narb.nestedfragments.MainActivity를 com.narb.nestedfragments.AsyncCounter $ SetVal로 캐스팅 할 수 없습니다. – narb

+0

@narb MyActivity는 방금 더미 이름을 지정했기 때문에 해결되지 않았습니다. 그것은 귀하의 단편을 포함하는 활동이어야합니다. 업데이트 된 답변 –

+0

을 확인하십시오 (컨텍스트 및 활동 모두에서 수행 한 작업). "this.sender = (SetVal) context;를 수행하려고하면 충돌이 발생합니다." java.lang.ClassCastException 오류 : com.narb.nestedfragments.MainActivity를 com.narb.nestedfragments.AsyncCounter $ SetVal로 캐스팅 할 수 없습니다. – narb