我正在尝试AsyncTask
。我无法理解如何返回结果。我也对doInBackground()
return
类型Void
感到困惑。为什么需要return null
;如果我return null
我将如何从这种方法中获得价值。
package com.example.shikkok_services;
import android.app.Dialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MyTask extends AsyncTask<Void, Integer, Void> {
//progressBar holo UI te kaj kore tai Context dorkar tai MyTask e construtor decler korlam.Inner class hole eita dorkar silo na
Context context;
Handler handler;
Dialog dialog;
TextView txtprogrss;
ProgressBar progress;
Button btnCancel;
MyTask(Context context, Handler handler){
this.context=context;
this.handler=handler;
}
MyTask(Context context){
this.context=context;
this.handler=handler;
}
//--------------------------------onPreExecute()............................................
@Override
protected void onPreExecute() {
super.onPreExecute();
// create dialog
dialog=new Dialog(context);
dialog.setCancelable(true);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.pogressdialog);
dialog.show();
txtprogrss=(TextView) dialog.findViewById(R.id.txtProgress);
progress=(ProgressBar)dialog.findViewById(R.id.progressBar2);
btnCancel=(Button)dialog.findViewById(R.id.btnProgress);
//progress=new ProgressBar(context);
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MyTask.this.cancel(true);
dialog.dismiss();
}
});
dialog.show();
}
//--------------------------------doInBackground()...........................
@Override
protected Void doInBackground(Void... arg0) {
//Kaj hobe backgournd e not UI e
// do tasks and update msg
for (int i = 0; i < 10; i++) {
if(isCancelled()){
break;
}else{
Log.e("In Background","current value;"+ i);
publishProgress(i);
//joto bar publishProgress() call hobe toto bar OnProgressUpdate hobe..
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
//------------------------------onProgressUpdate().....................................
@Override
protected void onProgressUpdate(Integer... values) {
//dowonload hole koto percent hosse seita dhore dhore UI te dekhalte parbo
super.onProgressUpdate(values);
// update dialog progress
progress.setProgress(values[0]);
txtprogrss.setText("progress update"+ values[0]+"%");
}
//-----------------------------OonPostExecute()...........................................
@Override
protected void onPostExecute(Void result) {
// jokhon kaj ses hoe jabe tokhon ei method e asben then UI te chole asben
super.onPostExecute(result);
// handler.sent message
dialog.dismiss();
Toast.makeText(context, "Finished", Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:4)
我也混淆了doInBackground是返回类型Void。为什么需要返回null;如果我返回null如何从这个方法获取值。请告诉我。
这是因为这就是你所做的。您可以return
一种类型,只需更改前面的类定义。
public class MyTask extends AsyncTask<Void, Integer, String> { // changed last param
有了这个,doInBackground()
将return
String
类型改为onPostExecute()
。这意味着您还必须将该方法更改为
@Override
protected void onPostExecute(String result) {
然后,您显然会将return
中的doInBackground()
语句更改为return someString
。
我使用String
作为示例,但您可以更改它。
至于AsyncTask结束后的返回值
See this answer about using an interface。它非常容易实现,并会在任务完成时更新Activity
。
答案 1 :(得分:1)
AsyncTask
必须返回null
,因为您这样声明:AsyncTask<Void, Integer, Void>
。第三个参数确定doInBackground()
返回的内容,以及onPostExecute()
得到的内容。
更改此数据类型以使其返回到您想要的位置,这样您就可以在onPostExecute()
方法中将其作为参数接收,甚至可以在主UI线程中更新View
从这个方法中(你甚至可以从doInBackground()
以外的任何地方更新它们。)
答案 2 :(得分:-2)
为了从异步任务调用获取值,请执行以下操作:
String result= new MyTask ().execute().get();
class MyTask extends AsyncTask<String, String, String>
{
protected String doInBackground(String... params)
return somevalue;
}
}