1

現時点で少し問題があります: 呼び出されたasynktaskが終了した後、私のフラグメントに2つのボタンを表示しようとしています。 asynctaskの最後に関数を実行する

while (!recordi.getterminé){ 

    } 
    terminé(); 

しかし、これは最適ではなく、私のアプリは:( に応答していないので、関数Termineのを(コールする任意のソリューションはonPostExecute機能で)がある おかげ

:そのために私はこれを使用していました?。ここ

は私のコードです:

フラグメント:

public class FragmentEnregistrer extends Fragment { 

    String path,nomfinal, ip="http://MYIP/php"; 
    ImageButton mrecord,mupload,mlire; 
    TextView Nomm; 
    ProgressBar progressbar; 
    int i=2; 
    EnregistrerSon recordi; 
    String id; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View myView= inflater.inflate(R.layout.enregistrer, container, false); 

     mrecord= (ImageButton) myView.findViewById(record); 
     mupload= (ImageButton) myView.findViewById(upload); 
     mlire= (ImageButton) myView.findViewById(lire); 
     Nomm = (TextView) myView.findViewById(NomWhizz); 
     progressbar = (ProgressBar) myView.findViewById(progressBar); 
     progressbar.setVisibility(View.INVISIBLE); 

     id=((MainActivity)getActivity()).getIdentifiant(); 

     mrecord.setOnClickListener(new View.OnClickListener() { 
      @RequiresApi(api = Build.VERSION_CODES.N) 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getActivity().getApplicationContext(), "Enregistrement en cours", Toast.LENGTH_SHORT).show(); 
       String nomm = Nomm.getText().toString(); 
       nomm=nomm.replace(" ", "_"); 
       nomm=nomm.replace("&", ""); 

       final String finalNomm = nomm; 
       recordi = new EnregistrerSon(); 
       recordi.execute(finalNomm); 
       terminé(); 






      } 
     }); 

     mupload.setOnClickListener(new View.OnClickListener() { 
      @RequiresApi(api = Build.VERSION_CODES.N) 
      @Override 
      public void onClick(View v) { 
       UploadOnServer upload = new UploadOnServer(); 
       progressbar.setVisibility(View.VISIBLE); 
       upload.execute(path,nomfinal); 
       progressbar.setVisibility(View.INVISIBLE); 

       HttpGetRequest request = new HttpGetRequest(); 
       request.execute(ip+"/son/creation_son.php?nom_whiz="+nomfinal+"&id_createur="+id); 

      } 
     }); 

     mlire.setOnClickListener(new View.OnClickListener() { 
      @RequiresApi(api = Build.VERSION_CODES.N) 
      @Override 
      public void onClick(View v) { 
       LireSonLocal local = new LireSonLocal(); 
       Uri myUri = Uri.parse("file://"+recordi.getAccess()); 
       local.execute(myUri); 

      } 
     }); 

     return myView; 
    } 

    @RequiresApi(api = Build.VERSION_CODES.N) 
    public void terminé(){ 
     Log.i("Enregistrement","terminé"); 
     Toast.makeText(getActivity().getApplicationContext(), "Enregistrement terminé", Toast.LENGTH_LONG).show(); 
     path = recordi.getAccess(); 
     nomfinal = recordi.getNomSansExtenssions(); 
     Log.i("nomfinale",nomfinal); 
     mlire.setVisibility(View.VISIBLE); 
     mupload.setVisibility(View.VISIBLE); 
     Log.i("test",""); 
} 

} 

そしてasynktask:

class EnregistrerSon extends AsyncTask<String,Void,String> { 
    private Boolean isRecording = false; 
    private Boolean termine = false; 
    private String Nom, NOM; 



    @RequiresApi(api = Build.VERSION_CODES.N) 
    @Override 
    protected String doInBackground(String... params) { 
     NOM = params[0]; 
     if(!isRecording){ 
      //configuration 
      Looper.prepare(); 
      MediaRecorder mr = new MediaRecorder(); 
      mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
      mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
      mr.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
      mr.setAudioChannels(1); 
      mr.setAudioEncodingBitRate(1280000); 
      mr.setAudioSamplingRate(9500000); 
      mr.setOutputFile(getAccess()); 
      try {mr.prepare();} 
      catch (IOException e) {e.printStackTrace();} 

      //Demarage du record 
      long start_time = System.currentTimeMillis(); //pendant 15 secondes 
      long wait_time = 15000; 
      long end_time = start_time + wait_time; 
      mr.start(); 
      while (System.currentTimeMillis() < end_time){ 
       Long temps = end_time - System.currentTimeMillis(); 

       isRecording = true; 
       //pendant 15 secondes 
      } 
      mr.stop(); 
      mr.reset(); 
      mr.release(); 
      isRecording = false; 
      termine = true; 
      //fin de l'enregistrement 
     } 
     return "lol"; 
    } 


    @RequiresApi(api = Build.VERSION_CODES.N) 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 


    } 

    @TargetApi(Build.VERSION_CODES.N) 
    @RequiresApi(api = Build.VERSION_CODES.N) 
    String getAccess(){ 
     MainActivity main = new MainActivity(); 
     if(Objects.equals(NOM, "Nom") || Objects.equals(NOM, "") || NOM == null) { 
      Calendar now = Calendar.getInstance(); 
      Nom = now.get(Calendar.HOUR_OF_DAY) + "_" + now.get(Calendar.DAY_OF_MONTH) + "_" + now.get(Calendar.MONTH) + "_" + now.get(Calendar.YEAR); 
     } 
     else{ 
      Nom = NOM; 
     } 
     File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Whizz/"); 
     directory.mkdirs(); 
     String filename = directory +"/"+Nom+".mp3"; 
     Log.i("filename",filename); 
     return filename; 
    } 

    Boolean getTerminé(){ 
     return termine; 
    } 

    String getNomSansExtenssions(){ 
     return Nom; 
    } 

} 

答えて

1

あなたの方法を実行するために、terminéAsyncTaskクラス内にあります。

  1. あなたEnregistrerSonクラス内FragmentEnregistrerのインスタンスフィールドを作成します。私は、次のを持ってお勧めします。

    private FragmentEnregistrer fragmentEnregistrer; 
    
  2. FragmentEnregistrerクラスの予想される引数を使用してEnregistrerSonクラスのコンストラクタを作成し、フィールド変数に引数を割り当てます。

    public EnregistrerSon(FragmentEnregistrer fe) { 
    this.fragmentEnregistrer = fe; 
    } 
    
  3. 次のようにあなたは、その後、onPostExecute方法でterminéメソッドを呼び出すことができます。

    protected void onPostExecute(String s) { 
        super.onPostExecute(s); 
        this.fragmentEnregistrer.terminé(); 
    } 
    
  4. 最終、EnregistrerSonインスタンス化にFragmentEnregistrerオブジェクトのインスタンスを渡します。

    recordi = new EnregistrerSon(FragmentEnregistrer.this); 
    recordi.execute(finalNomm); 
    
+0

は完璧に機能します!ありがとう:) –

1

まず、ラインwhile (!recordi.getterminé){} terminé();は意味をなさない、それは等しい:

while (!recordi.getterminé){ 

} 
terminé(); 

onPostExecuteに関しては、はい、それだけで関数呼び出しを記述します。

protected void onPostExecute(String s) { 

    // Anything here will be executed at the end, when doInBackground finishes 
    terminé(); 
} 
+0

これはできません:私はこのエラーがあります:メソッドのterminé()を解決できません。あなたの助けをありがとう –

+0

彼らは異なるクラスに属しているからです。 [解決方法](http://stackoverflow.com/a/42319105/7373404)を参照して修正してください。 – JonZarate

1

放送/レシーバーパターン、onhandleintentを(使用)は、あなたのボタンを表示させることができ、UIスレッド上で実行されます。
1.非同期タスクを開始します。 2. BroadcastReceiverを定義し、アクティビティでインスタンス化し、それに応じて登録/登録解除します。 3.非同期タスクのonpostexecute()はsendBroadcastを呼び出します。 AsyncTaskをインスタンス化するときにコンテキストパラメータを渡す必要があるかもしれません。 アプリケーションのブロードキャスト受信者(手順2でインスタンス化したもの)のonHandleIntentメソッドがUIスレッド上で実行され、これらのUI更新をすべて安全にします。

+0

私はstackoverflowに投稿する前に使用しようとしていた、それは私のために(しかし、アプリがクラッシュし続けていない)があなたの助けをありがとう。 –

+0

放送受信機を使用しましたか?もしそうなら、質問に言及してください。答えを提案するのに役立ちます。 –

関連する問題