在 asynctask 结束时执行一个函数
Execute a function on the end of asynctask
我现在遇到了一个小问题:
在我调用的 asynktask 完成后,我试图在我的片段上制作可见的 2 个按钮。为此,我使用了这个:
while (!recordi.getterminé){
}
terminé();
但这不是最优的,我的应用程序没有响应:(
那么在onPostExecute函数中调用函数terminé()有什么解决办法吗?
谢谢
这是我的代码:
片段:
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","");
}
}
还有异步任务:
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;
}
}
首先,第 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é();
}
要在 AsyncTask
class 中执行您的方法 terminé
。我建议有以下内容:
在您的 EnregistrerSon
class.
中创建 FragmentEnregistrer
的实例字段
private FragmentEnregistrer fragmentEnregistrer;
在 EnregistrerSon
class 中创建一个构造函数,预期参数为 FragmentEnregistrer
class,并将参数分配给字段变量。
public EnregistrerSon(FragmentEnregistrer fe) {
this.fragmentEnregistrer = fe;
}
然后可以在onPostExecute
方法中调用terminé
方法,如下:
protected void onPostExecute(String s) {
super.onPostExecute(s);
this.fragmentEnregistrer.terminé();
}
最后,在 EnregistrerSon
实例化时传递 FragmentEnregistrer
对象的实例。
recordi = new EnregistrerSon(FragmentEnregistrer.this);
recordi.execute(finalNomm);
使用 Broadcast/Receiver 模式,onhandleintent() 将 运行 在 UI 线程上,您可以在其中使按钮可见。
1.Start 异步任务。
2.Define 一个 BroadcastReceiver,在您的 activity 和 register/unregister 中相应地实例化一个。
3.In 异步任务的 onpostexecute() 只调用 sendBroadcast。在实例化 AsyncTask 时,您可能需要传递上下文参数。
您应用的广播接收器(您在第 2 步中实例化的那个)的 onHandleIntent 方法将 运行 在 UI 线程上,使所有这些 UI 更新安全。
我现在遇到了一个小问题: 在我调用的 asynktask 完成后,我试图在我的片段上制作可见的 2 个按钮。为此,我使用了这个:
while (!recordi.getterminé){
}
terminé();
但这不是最优的,我的应用程序没有响应:( 那么在onPostExecute函数中调用函数terminé()有什么解决办法吗? 谢谢
这是我的代码:
片段:
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","");
}
}
还有异步任务:
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;
}
}
首先,第 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é();
}
要在 AsyncTask
class 中执行您的方法 terminé
。我建议有以下内容:
在您的
中创建EnregistrerSon
class.FragmentEnregistrer
的实例字段private FragmentEnregistrer fragmentEnregistrer;
在
EnregistrerSon
class 中创建一个构造函数,预期参数为FragmentEnregistrer
class,并将参数分配给字段变量。public EnregistrerSon(FragmentEnregistrer fe) { this.fragmentEnregistrer = fe; }
然后可以在
onPostExecute
方法中调用terminé
方法,如下:protected void onPostExecute(String s) { super.onPostExecute(s); this.fragmentEnregistrer.terminé(); }
最后,在
EnregistrerSon
实例化时传递FragmentEnregistrer
对象的实例。recordi = new EnregistrerSon(FragmentEnregistrer.this); recordi.execute(finalNomm);
使用 Broadcast/Receiver 模式,onhandleintent() 将 运行 在 UI 线程上,您可以在其中使按钮可见。
1.Start 异步任务。
2.Define 一个 BroadcastReceiver,在您的 activity 和 register/unregister 中相应地实例化一个。
3.In 异步任务的 onpostexecute() 只调用 sendBroadcast。在实例化 AsyncTask 时,您可能需要传递上下文参数。
您应用的广播接收器(您在第 2 步中实例化的那个)的 onHandleIntent 方法将 运行 在 UI 线程上,使所有这些 UI 更新安全。