需要主类访问AsyncTask的价值 [英] Need to access AsyncTask value in Main Class

查看:112
本文介绍了需要主类访问AsyncTask的价值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在面临一个问题,在异步任务,任何人都可以请建议我任何解决方案。结果
我已经下载了此链接这个例子:结果

我目前的结构是

我试图让我的结果设定值从接口的方法来执行我的进一步操作的主类。结果
我试图让从静态变量,静态方法的价值,但非他们的工作,并与创建一个新的类对象试图发送和接收的结果,但每次都让我的 NullPointerException异常。因为AsyncTask的写入后的声明得到结果之前得到执行时。

我也试图从它的方法getStaus()得到的AsyncTask的地位,但它仅返回运行,当任务完成或成品药不通知。

下面是code样品:<​​/ P>

主类code:

 包com.example.androidasynctask;
公共类MainActivity扩展活动实现AsyncTaskCompleteListener {公共静态的String [] asyncResult;
字符串资源[] = NULL;@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
}公共无效btnclick(查看视图){
    / * MyTask的AsyncTask =新MyTask(本);
    的String [] = asyncTaskResult asyncTask.execute(fetchCategory.php,1%ID%1); * /    // AsyncTask的&LT;弦乐,无效的String []&GT; asyncTaskRes =新MyTask(本).execute(fetchCategory.php,1%ID%1);
    //新MyTask(本).execute(fetchCategory.php,1%ID%1);
    MyTask的AsyncTask =(MyTask)新MyTask(本).execute(fetchCategory.php,1%ID%1);     如果(asyncTask.getStatus()。等于(AsyncTask.Status.FINISHED)|| asyncTask.getStatus()。等于(AsyncTask.Status.PENDING)){
         asyncTask.execute();
     }
     其他{         Log.v(中的其他,获得值);
     }}@覆盖
公共无效onTaskComplete(的String []的结果){
    Log.v(在任务完成,VALUE =+结果[1]);
}/ * @覆盖
公共无效onTaskComplete(字符串结果){
    的System.out.println(调用onTaskComplete简单......);
    的System.out.println(结果::+结果);
} * /公共静态类GetAsyncResult
{
    静态的String [] returnValues​​;
    公共GetAsyncResult()
    {}
    公共GetAsyncResult(字符串[] RES)
    {        returnValues​​ =资源;
        Log.v(getResultSetValues​​,returnValues​​+ returnValues​​ [1]);
    }
    公共无效getResultSetValues​​()
    {
        Log.v(getResultSetValues​​,returnValues​​+ returnValues​​ [1]);
    }}}

异步任务code:

 公共类MyTask扩展的AsyncTask&LT;弦乐,无效的String []&GT; {私人活动活动;
私人ProgressDialog对话框;
私人AsyncTaskCompleteListener回调;
公众的String [] asyncResultSetValue = NULL;
公共MyTask(活动行为){
    Log.v(我的任务,活动+行为);
    this.activity =行为;
    this.callback =(AsyncTaskCompleteListener)行为;
}@覆盖
在preExecute保护无效(){
    super.on preExecute();    Log.v(我的任务,在ON pre EXECUTE);
    对话框=新ProgressDialog(活动);
    dialog.setMessage(正在加载...);
    dialog.show();
}@覆盖
受保护的String [] doInBackground(字符串... PARAMS){
    Log.v(我的任务,做背景);
    Log.v(PARAMS,PARAMS [0] =+参数[0] +| PARAMS [1]+ PARAMS [1]);
    asyncResultSetValue = Utils.process_query(PARAMS [0],则params [1]);
    返回asyncResultSetValue;
}@覆盖
保护无效onPostExecute(的String []的结果){
    super.onPostExecute(结果);
    Log.v(我的任务,在关于后执行);
    如果(空=对话和放大器;!&安培; dialog.isShowing()){
        dialog.dismiss();
    }
    callback.onTaskComplete(结果);
}}

HTTP类code:

 公共类utils的{    静态字符串结果= NULL;
    串endResult;
    静态的java.io.InputStream是= NULL;
    静态StringBuilder的SB = NULL;
    静态字符串分隔符=\\\\ |;
    静态字符串delimiter1 =\\\\%;
    静态的String [] TEMP = NULL;
    静态的String [] temp1目录= NULL;
    静态的ArrayList&LT;&的NameValuePair GT; namevaluepairs中;
    静态上下文的背景下;
    静态ProgressDialog支持mDialog;
    静态的Htt presponse响应;
    静态的String [] resultset_value = NULL;
    //静态字符串的URL =htt​​p://fortuneworkinprogress.in/News_App/; //全局URL
    静态字符串URL =htt​​p://10.0.2.2/News_App/; //全局URL
    静态字符串QUERY_TYPE,参数;    / ***************过程查询的起始*************** /
      公共静态的String [] process_query(字符串str_url,字符串参数){
            //字符串strval = select_parameter;
        字符串RET_VAL [] = NULL;
        字符串get_sel_val [] = NULL;
        INT loopcount = 0;
        URL = URL + str_url; // !!!! ######### CONCATINATING并创建完整的URL ######## !!!!!! //
        Log.v(PROCESS查询参数,URL =+网址+|放慢参数=+参数);
        namevaluepairs中=新的ArrayList&LT;&的NameValuePair GT;();        //Log.i(\"STR VAL,+ strval); //要检查哪些值收到
        尝试
        {
            字符串strval =参数;
            get_sel_val = strval.split(delimiter1);            的for(int i = 0; I&LT; get_sel_val.length;我++)
            {                loopcount =的Integer.parseInt(get_sel_val [0]); //首先Delimeted值告诉张数
                Log.i(Loopcount,CNT =+ loopcount);            }            对于(INT J = 1; J&LT; =(loopcount * 2);当J = J + 2)// for循环使名称值削去动态
            {
                nameValuePairs.add(新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]);
            }
        }
        赶上(例外五)
        {
            Log.w(异常在获得价值,EXP =+ e)条;
        }        //nameValuePairs.add(new BasicNameValuePair(ID,1));        尝试{
                HttpClient的HttpClient的=新DefaultHttpClient();
                HttpPost httppost =新HttpPost(URL);
                Log.v(连接网址,最后的网址+网址);
                Log.w(连接状态,httppost.toString());
                httppost.setEntity(新UrlEn codedFormEntity(namevaluepairs中));
                Log.w(PAERSE价值,nameValuePairs.toString());
                HTT presponse响应= httpclient.execute(httppost);
                HttpEntity实体= response.getEntity();
                是= entity.getContent();
                Log.w(1,连接succesfuly establised);
           }
         赶上(例外五)
         {
             Log.e(log_tag,在HTTP连接错误+ e.toString());
         }         尝试{
                读者的BufferedReader =新的BufferedReader(新的InputStreamReader(是,ISO-8859-1),8);
                SB =新的StringBuilder();
                sb.append(reader.readLine()+\\ n);
                Log.v(SB VALUE =,SB =+ sb.toString());
                串行=0;
                而((行= reader.readLine())!= NULL)
                {
                    sb.append(行+\\ n);
                }
               is.close();
               结果= sb.toString();                // Toast.makeText(getBaseContext(),结果,Toast.LENGTH_LONG).show();                Log.w(结果,结果);
            }
          赶上(例外五)
          {
              Log.e(log_tag,错误转换结果+ e.toString());
              Toast.makeText(NULL,错误转换响应串,Toast.LENGTH_LONG).show();
          }         的String [] TEMP = NULL;
         的String [] TEM presult = NULL;         如果(结果!= NULL)
         {
             透射电镜presult = result.split(分隔符); //拆分整个返回的字符串为行
             的for(int i = 0; I&LT; TEM presult.length-1;我++)
              {
                 温度= NULL;
                 TEMP = TEM presult [I] .split(delimiter1); //查找每一行的列
                 RET_VAL =温度;
                 resultset_value = RET_VAL;
              }
        }
        其他
        {
            Toast.makeText(NULL,无法查找路由,Toast.LENGTH_LONG).show();
        }         Log.v(前RETUNR =,RET_VAL =+ ret_val.toString());
         返回RET_VAL; //返回结果值数组
    }
                    / ***************过程查询结尾*************** /      公共静态布尔isNetworkAvailable(活动活动)
      {
        ConnectivityManager连接=(ConnectivityManager)活动
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        如果(连接== NULL)
        {
            返回false;
        }
        其他
        {
            的NetworkInfo []信息= connectivity.getAllNetworkInfo();
            如果(信息!= NULL)
            {
                的for(int i = 0; I&LT; info.length;我++){
                    如果(资讯[I] .getState()== NetworkInfo.State.CONNECTED)
                    {
                        返回true;
                    }
                }
            }
        }
        返回false;
    }}

先谢谢了。


解决方案

 由于AsyncTask的写入后的声明得到结果之前得到执行时。

原因是 的AsyncTask 在单独的线程上运行,而不是在你的主(UI)线程。

  MyTask扩展异步任务和onPostExcute包含CallBackMethod将返回结果集从doInBackground了。

您将在此方法会得到结果值

  @覆盖
公共无效onTaskComplete(的String []的结果){
    Log.v(在任务完成,VALUE =+结果[1]);
}

下面这段code的注释,

 如果(asyncTask.getStatus()。等于(AsyncTask.Status.FINISHED)|| asyncTask.getStatus()。等于(AsyncTask.Status.PENDING)){
     asyncTask.execute();
 }
 其他{     Log.v(中的其他,获得值);
 }

请变化,

公共静态的String [] asyncResult; 公共字符串[] asyncResult = NULL;

更改之后,

asyncResultSetValue = Utils.process_query(PARAMS [0],则params [1]); asyncResult = Utils.process_query(PARAMS [0] ,则params [1]);
返回asyncResultSetValue; 收益asyncResult;

看值由增加一个日志,你会被这种方法得到的结果值

  @覆盖
公共无效onTaskComplete(的String []的结果){
    Log.v(在任务完成,VALUE =+结果[1]);
    Log.v(在任务完成,VALUE =+ asyncResult [1]);}

I am facing an issue in Async task, can anyone please suggest me any solution.
I have downloaded this example from this link :
Source

My Current Structure is

  • Main Class extends MyTask and implements AsyncTaskCompleteListener interface.
  • AsyncTaskCompleteListener is an Interface contains the onTaskComplete Method .
  • MyTask extends Async Task and onPostExcute contains CallBackMethod which will return the result-set got from the doInBackground.
  • Http Class(Utils) contains the Http connection and returns the Result-set to AsyncTaskComleteListner from PostExecute.

I am trying to get my result-set Value in the main class from the interface method to perform my further operation.
I tried to get the value from static variables, static method but non of them worked, and also tried with creating a new class object to send and receive the result but every time it gives me NullPointerException . Because the statement written after the AsyncTask gets executes before getting the result.

I have also tried to get the Status of asyncTask from its method getStaus(), but it returns only Running and dose not notify when the task is completed or finished.

Here is the code sample:

Main Class Code :

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]);


    }

}

}

Async Task Code :

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);
}

}

HTTP CLASS CODE :

 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;
    }

}

Thanks in advance.

解决方案

Because the statement written after the AsyncTask gets executes before getting the result.

the reason is AsyncTask runs on separate thread,not on your Main(UI) thread.

MyTask extends Async Task and onPostExcute contains CallBackMethod which will return the result-set got from the doInBackground.

you will be getting result values on this method

   @Override
public void onTaskComplete(String[] result) {
    Log.v("IN ON TASK COMPLETE","VALUE = "+result[1]);


}

Comment following piece of code,

    if(asyncTask.getStatus().equals(AsyncTask.Status.FINISHED) || asyncTask.getStatus().equals(AsyncTask.Status.PENDING)) {
     asyncTask.execute();
 }
 else {

     Log.v("In Else","Get Value");
 }

Make change,

public static String[] asyncResult; to public String[] asyncResult = null;

Change following,

asyncResultSetValue = Utils.process_query(params[0],params[1]); to asyncResult = Utils.process_query(params[0],params[1]); and return asyncResultSetValue; to return asyncResult ;

look at value by adding one more log,you will be getting result values on this method

   @Override
public void onTaskComplete(String[] result) {
    Log.v("IN ON TASK COMPLETE","VALUE = "+result[1]);
    Log.v("IN ON TASK COMPLETE","VALUE = "+asyncResult[1]);

}

这篇关于需要主类访问AsyncTask的价值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆