Android 需要访问主类中的AsyncTask值
我在异步任务中遇到了一个问题,有人能给我建议解决方案吗。Android 需要访问主类中的AsyncTask值,android,android-asynctask,Android,Android Asynctask,我在异步任务中遇到了一个问题,有人能给我建议解决方案吗。 我已从以下链接下载了此示例: 我目前的结构是 Main类扩展MyTask并实现AsyncTaskCompleteListener接口 AsyncTaskCompleteListener是一个包含onTaskComplete方法的接口 MyTask扩展了Async Task,OnPostExecute包含CallBackMethod,它将返回从doInBackground获得的结果集 Http类(Utils)包含Http连接,并从Pos
我已从以下链接下载了此示例:
我目前的结构是
- Main类扩展MyTask并实现AsyncTaskCompleteListener接口
- AsyncTaskCompleteListener是一个包含onTaskComplete方法的接口李>
- MyTask扩展了Async Task,OnPostExecute包含CallBackMethod,它将返回从doInBackground获得的结果集李>
- Http类(Utils)包含Http连接,并从PostExecute将结果集返回给AsyncTaskComleteListner李>
我试图从静态变量中获取值,静态方法(但其中没有一个有效),还尝试创建一个新的类对象来发送和接收结果,但每次它都给我NullPointerException。因为AsyncTask获取后编写的语句在获取结果之前执行 我还尝试从其方法getStaus()获取asyncTask的状态,但它只返回Running,而不在任务完成或完成时通知 以下是代码示例: 主类代码:
package com.example.androidasynctask;
public class MainActivity extends Activity implements AsyncTaskCompleteListener {
public static String[] asyncResult;
String res[] = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void btnclick(View view) {
/*MyTask asyncTask = new MyTask(this);
String [] asyncTaskResult = asyncTask.execute("fetchCategory.php","1%Id%1");*/
//AsyncTask<String, Void, String[]> asyncTaskRes = new MyTask(this).execute("fetchCategory.php","1%Id%1");
//new MyTask(this).execute("fetchCategory.php","1%Id%1");
MyTask asyncTask = (MyTask) new MyTask(this).execute("fetchCategory.php","1%Id%1");
if(asyncTask.getStatus().equals(AsyncTask.Status.FINISHED) || asyncTask.getStatus().equals(AsyncTask.Status.PENDING)) {
asyncTask.execute();
}
else {
Log.v("In Else","Get Value");
}
}
@Override
public void onTaskComplete(String[] result) {
Log.v("IN ON TASK COMPLETE","VALUE = "+result[1]);
}
/*@Override
public void onTaskComplete(String result) {
System.out.println("calling onTaskComplete SIMPLE....");
System.out.println("result :: "+ result);
}*/
public static class GetAsyncResult
{
static String[] returnValues;
public GetAsyncResult()
{}
public GetAsyncResult(String[] res)
{
returnValues = res;
Log.v("getResultSetValues","returnValues"+returnValues[1]);
}
public void getResultSetValues()
{
Log.v("getResultSetValues","returnValues"+returnValues[1]);
}
}
}
public class MyTask extends AsyncTask<String, Void, String[]> {
private Activity activity;
private ProgressDialog dialog;
private AsyncTaskCompleteListener callback;
public String[] asyncResultSetValue = null;
public MyTask(Activity act) {
Log.v("MY TASK","ACTIVITY"+act);
this.activity = act;
this.callback = (AsyncTaskCompleteListener)act;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.v("MY TASK","in ON PRE EXECUTE");
dialog = new ProgressDialog(activity);
dialog.setMessage("Loading...");
dialog.show();
}
@Override
protected String[] doInBackground(String... params) {
Log.v("MY TASK","DO IN BACKGROUND");
Log.v("PARAMS"," params[0] = "+params[0]+ "| params[1]"+params[1]);
asyncResultSetValue = Utils.process_query(params[0],params[1]);
return asyncResultSetValue;
}
@Override
protected void onPostExecute(String[] result) {
super.onPostExecute(result);
Log.v("MY TASK","in ON POST EXECUTE");
if (null != dialog && dialog.isShowing()) {
dialog.dismiss();
}
callback.onTaskComplete(result);
}
}
package com.example.androidasynctask;
公共类MainActivity扩展活动实现AsyncTaskCompleteListener{
公共静态字符串[]异步结果;
字符串res[]=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
公共无效BTN单击(视图){
/*MyTask asyncTask=新建MyTask(此);
字符串[]asyncTaskResult=asyncTask.execute(“fetchCategory.php”,“1%Id%1”)*/
//AsyncTask asyncTaskRes=new MyTask(this).execute(“fetchCategory.php”,“1%Id%1”);
//新建MyTask(this.execute)(“fetchCategory.php”,“1%Id%1”);
MyTask asyncTask=(MyTask)new MyTask(this).execute(“fetchCategory.php”,“1%Id%1”);
if(asyncTask.getStatus().equals(asyncTask.Status.FINISHED)| asyncTask.getStatus().equals(asyncTask.Status.PENDING)){
asyncTask.execute();
}
否则{
Log.v(“在Else中”、“获取值”);
}
}
@凌驾
公共void onTaskComplete(字符串[]结果){
Log.v(“在任务完成时输入”,“VALUE=“+result[1]);
}
/*@凌驾
公共void onTaskComplete(字符串结果){
System.out.println(“调用onTaskComplete SIMPLE…”);
System.out.println(“结果::”+result);
}*/
公共静态类GetAsyncResult
{
静态字符串[]返回值;
公共GetAsyncResult()
{}
公共GetAsyncResult(字符串[]res)
{
返回值=res;
Log.v(“getResultSetValues”、“returnValues”+returnValues[1]);
}
public void getResultSetValues()
{
Log.v(“getResultSetValues”、“returnValues”+returnValues[1]);
}
}
}
异步任务代码:
package com.example.androidasynctask;
public class MainActivity extends Activity implements AsyncTaskCompleteListener {
public static String[] asyncResult;
String res[] = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void btnclick(View view) {
/*MyTask asyncTask = new MyTask(this);
String [] asyncTaskResult = asyncTask.execute("fetchCategory.php","1%Id%1");*/
//AsyncTask<String, Void, String[]> asyncTaskRes = new MyTask(this).execute("fetchCategory.php","1%Id%1");
//new MyTask(this).execute("fetchCategory.php","1%Id%1");
MyTask asyncTask = (MyTask) new MyTask(this).execute("fetchCategory.php","1%Id%1");
if(asyncTask.getStatus().equals(AsyncTask.Status.FINISHED) || asyncTask.getStatus().equals(AsyncTask.Status.PENDING)) {
asyncTask.execute();
}
else {
Log.v("In Else","Get Value");
}
}
@Override
public void onTaskComplete(String[] result) {
Log.v("IN ON TASK COMPLETE","VALUE = "+result[1]);
}
/*@Override
public void onTaskComplete(String result) {
System.out.println("calling onTaskComplete SIMPLE....");
System.out.println("result :: "+ result);
}*/
public static class GetAsyncResult
{
static String[] returnValues;
public GetAsyncResult()
{}
public GetAsyncResult(String[] res)
{
returnValues = res;
Log.v("getResultSetValues","returnValues"+returnValues[1]);
}
public void getResultSetValues()
{
Log.v("getResultSetValues","returnValues"+returnValues[1]);
}
}
}
public class MyTask extends AsyncTask<String, Void, String[]> {
private Activity activity;
private ProgressDialog dialog;
private AsyncTaskCompleteListener callback;
public String[] asyncResultSetValue = null;
public MyTask(Activity act) {
Log.v("MY TASK","ACTIVITY"+act);
this.activity = act;
this.callback = (AsyncTaskCompleteListener)act;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.v("MY TASK","in ON PRE EXECUTE");
dialog = new ProgressDialog(activity);
dialog.setMessage("Loading...");
dialog.show();
}
@Override
protected String[] doInBackground(String... params) {
Log.v("MY TASK","DO IN BACKGROUND");
Log.v("PARAMS"," params[0] = "+params[0]+ "| params[1]"+params[1]);
asyncResultSetValue = Utils.process_query(params[0],params[1]);
return asyncResultSetValue;
}
@Override
protected void onPostExecute(String[] result) {
super.onPostExecute(result);
Log.v("MY TASK","in ON POST EXECUTE");
if (null != dialog && dialog.isShowing()) {
dialog.dismiss();
}
callback.onTaskComplete(result);
}
}
公共类MyTask扩展了AsyncTask{
私人活动;
私人对话;
私有AsyncTaskCompleteListener回调;
公共字符串[]asyncResultSetValue=null;
公共任务(活动法){
Log.v(“我的任务”、“活动”+行动);
这个活动=行动;
this.callback=(AsyncTaskCompleteListener)act;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
Log.v(“我的任务”,“在预执行中”);
dialog=新建进度对话框(活动);
setMessage(“加载…”);
dialog.show();
}
@凌驾
受保护字符串[]doInBackground(字符串…参数){
Log.v(“我的任务”,“在后台做”);
Log.v(“参数”,“参数[0]=”+参数[0]+“|参数[1]”+参数[1]);
asyncResultSetValue=Utils.process_查询(参数[0],参数[1]);
返回asyncResultSetValue;
}
@凌驾
受保护的void onPostExecute(字符串[]结果){
super.onPostExecute(结果);
Log.v(“我的任务”,“在执行后”中);
if(null!=dialog&&dialog.isShowing()){
dialog.dismise();
}
callback.onTaskComplete(结果);
}
}
HTTP类代码:
public class Utils {
static String result = null;
String endResult;
static java.io.InputStream is = null;
static StringBuilder sb=null;
static String delimiter = "\\|";
static String delimiter1 = "\\%";
static String[] temp = null;
static String[] temp1 = null;
static ArrayList<NameValuePair> nameValuePairs;
static Context context;
static ProgressDialog mDialog;
static HttpResponse response;
static String[] resultset_value = null;
//static String url = "http://fortuneworkinprogress.in/News_App/"; //Global URL
static String url = "http://10.0.2.2/News_App/"; //Global URL
static String query_type,parameter;
/*************** PROCESS QUERY START ***************/
public static String[] process_query(String str_url, String parameter) {
// String strval = select_parameter;
String ret_val[] = null;
String get_sel_val[] = null;
int loopcount =0;
url = url+str_url; //!!!! ######### CONCATINATING AND CREATING FULL URL ######## !!!!!!//
Log.v("PROCESS QUERY PARAMETER","URL = "+url+" | PARAMTER = "+parameter);
nameValuePairs = new ArrayList<NameValuePair>();
//Log.i("STR VAL",""+strval); //To Check which values are recieved
try
{
String strval = parameter;
get_sel_val=strval.split(delimiter1);
for(int i =0; i < get_sel_val.length ; i++)
{
loopcount = Integer.parseInt(get_sel_val[0]); // First Delimeted Value which tells the number of count
Log.i("Loopcount","cnt = "+loopcount);
}
for(int j=1;j<=(loopcount*2);j=j+2) //For Loop for making Name Values Pares Dynamic
{
nameValuePairs.add(new BasicNameValuePair(get_sel_val[j],get_sel_val[j+1]));
//Log.i("J = ["+j+"]","pairvalue1 = "+get_sel_val[j]+"pairvalue2 ="+get_sel_val[j+1]);
}
}
catch(Exception e)
{
Log.w("Exception in the getting value","Exp = "+e);
}
//nameValuePairs.add(new BasicNameValuePair("id","1"));
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
Log.v("CONNECT URL ","Final url "+url);
Log.w("CONNECTION STATUS ",httppost.toString());
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Log.w("PAERSE VALUE ",nameValuePairs.toString());
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
Log.w("1", "Connection establised succesfuly");
}
catch(Exception e)
{
Log.e("log_tag", "Error in http connection"+e.toString());
}
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
Log.v("SB VALUE = ","sb = "+sb.toString());
String line="0";
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
result=sb.toString();
// Toast.makeText(getBaseContext(), result ,Toast.LENGTH_LONG).show();
Log.w("result", result);
}
catch(Exception e)
{
Log.e("log_tag", "Error converting result "+e.toString());
Toast.makeText(null, "error converting response to string" ,Toast.LENGTH_LONG).show();
}
String[] temp = null;
String[] tempResult = null;
if(result!=null)
{
tempResult = result.split(delimiter); //Split the entire return string into "rows"
for(int i =0; i < tempResult.length-1 ; i++)
{
temp = null;
temp = tempResult[i].split(delimiter1); //Find columns for each row
ret_val = temp;
resultset_value=ret_val;
}
}
else
{
Toast.makeText(null, "Cannot Find Routes" ,Toast.LENGTH_LONG).show();
}
Log.v("BEFORE RETUNR = ","ret_val = "+ret_val.toString());
return ret_val; //Returning the result value array
}
/*************** PROCESS QUERY ENDS ***************/
public static boolean isNetworkAvailable(Activity activity)
{
ConnectivityManager connectivity = (ConnectivityManager) activity
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null)
{
return false;
}
else
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
{
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
}
return false;
}
}
公共类Utils{
静态字符串结果=null;
字符串结束结果;
静态java.io.InputStream为空;
静态StringBuilder sb=null;
静态字符串分隔符=“\\\\;”;
静态字符串分隔符1=“\\%”;
静态字符串[]temp=null;
静态字符串[]temp1=null;
静态ArrayList nameValuePairs;
静态语境;
静态进程对话框mDialog;
静态HttpResponse响应;
静态字符串[]resultset_value=null;
//静态字符串url=”http://fortuneworkinprogress.in/News_App/“;//全局URL
静态字符串url=”http://10.0.2.2/News_App/“;//全局URL
静态字符串查询类型,参数;
/***************进程查询启动***************/
公共静态字符串[]进程查询(字符串str\u url,字符串参数){
//String strval=选择_参数;
字符串ret_val[]=null;
字符串get_sel_val[]=null;
int loopcount=0;
url=url+str#url;///
Log.v(“过程查询参数”,“URL=“+URL+”|参数=“+PARAMETER”);
nameValuePairs=新的ArrayList();
//Log.i(“STR VAL”,“”+strval);//检查接收到的值
尝试
{
字符串strval=参数;
get_sel_val=strval.split(delimiter1);
for(int i=0;i
你
@Override
public void onTaskComplete(String[] result) {
Log.v("IN ON TASK COMPLETE","VALUE = "+result[1]);
}
if(asyncTask.getStatus().equals(AsyncTask.Status.FINISHED) || asyncTask.getStatus().equals(AsyncTask.Status.PENDING)) {
asyncTask.execute();
}
else {
Log.v("In Else","Get Value");
}
@Override
public void onTaskComplete(String[] result) {
Log.v("IN ON TASK COMPLETE","VALUE = "+result[1]);
Log.v("IN ON TASK COMPLETE","VALUE = "+asyncResult[1]);
}