当前位置: 首页 > 知识库问答 >
问题:

由于AsyncTask是一个单独的类,如何将OnPostExecute()的结果转换为main activity?

张勇
2023-03-14

我从这个链接中阅读并应用了一些内容:如何将OnPostExecute()的结果获取到main activity,因为AsyncTask是一个单独的类?但是我在行委托上得到一个错误NullPointerException onPostExecute。ProcessFinish(result);我的代码有什么问题?代码如下:

public class MainActivity extends Activity implements AsyncResponse{
  ProductConnect asyncTask =new ProductConnect();

  public void processFinish(String output){
    //this you will received result fired from async class of onPostExecute(result) method. 
    Log.v(TAG, output); 
  }


 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   asyncTask.delegate = this;
   setContentView(R.layout.activity_main);

   Button b = (Button) findViewById(R.id.button1);
   final Intent i=new Intent(MainActivity.this, second.class);
   b.setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View arg0) {

     // TODO Auto-generated method stub
     new ProductConnect().execute(true);
     startActivity(i);
     //startActivity(new Intent(MainActivity.this, second.class));

    }
  });
}


    // START DATABASE CONNECTION        
    class ProductConnect extends AsyncTask<Boolean, String, String> {          
       public AsyncResponse delegate=null;         
       private Activity activity;          
       public void MyAsyncTask(Activity activity) {
            this.activity = activity;
        }


       @Override
       protected String doInBackground(Boolean... params) {
         String result = null;
         StringBuilder sb = new StringBuilder();
           try {
             // http post
         HttpClient httpclient = new DefaultHttpClient();
         HttpGet httppost = new HttpGet("http://192.168.2.245/getProducts.php");
         HttpResponse response = httpclient.execute(httppost);
         if (response.getStatusLine().getStatusCode() != 200) {
           Log.d("MyApp", "Server encountered an error");
         }

         BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF8"));
         sb = new StringBuilder();
         sb.append(reader.readLine() + "\n");
         String line = null;

         while ((line = reader.readLine()) != null) {
           sb.append(line + "\n");
         }

             result = sb.toString();
         Log.d("test", result);
        } catch (Exception e) {
          Log.e("log_tag", "Error converting result " + e.toString());
        }
          return result;
        }

        @Override
        protected void onPostExecute(String result) {
          try {
            JSONArray jArray = new JSONArray(result);
            JSONObject json_data;
            for (int i = 0; i < jArray.length(); i++) {
              json_data = jArray.getJSONObject(i);
                  t = json_data.getString("name");
                  delegate.processFinish(result);
             }

             } catch (JSONException e1) {
             e1.printStackTrace();
             } catch (ParseException e1) {
             e1.printStackTrace();
             }
               super.onPostExecute(result);
        }

         protected void onPreExecute() {
           super.onPreExecute();
           ProgressDialog pd = new ProgressDialog(MainActivity.this);
           pd.setTitle("Lütfen Bekleyiniz");
           pd.setMessage("Authenticating..");
           pd.show();
         }
    }

共有1个答案

蒙峰
2023-03-14

将变量初始化为null

public AsyncResponse delegate=null;

因此,当您尝试使用它时,它自然会给出NPE。您可以在活动中给它一个值,以便将该值传递给AsyncTask的构造函数,并将其初始化为该对象。

 类似资料:
  • 问题内容: 我有这两节课。我的主要活动和扩展的一个,现在在我的主要活动,我需要从得到的结果中。如何将结果传递或获得主要活动? 这是示例代码。 我的主要活动。 这是AsyncTask类 问题答案: 简单: 创建interface类,其中是可选的,或者可以是您想要返回的任何变量。 转到您的AsyncTask课程,并将interface声明AsyncResponse为字段: 在您的主要活动中,需要进行i

  • 我有两个类。我的主要activity和扩展的一个,现在在我的主要activity中,我需要从中的获得结果。我怎样才能通过或得到结果到我的主要activity? 下面是示例代码。 我的主要activity。 这是AsyncTask类

  • 我在获取AsyncTask类的onPostExecute()方法给出的值时遇到了一个问题,为什么它不显示给TextView? 但是,在中没有显示字符串响应,为什么会这样呢?对此有哪些可能的解决方案?

  • 问题内容: 首先,抱歉英语不好。我有android 2.3,所以有“真实”并行AsyncTask而不是顺序执行(android 3.0及更高版本)。我有几个AsyncTasks,它们每个都执行onPostExecute()回调(我知道它将在UI线程中执行)。假设我只有两个并行的AsyncTask,并且当第一个任务完成其工作时,将调用回调onPostExecute()。是否有可能在UI线程上运行on

  • 目前,我在主activity类和widget类中都声明了一个AsyncTask。除了中的结果处理之外,其他代码都是一样的(在activity中,检索到的结果转到activity中的textview,而在小部件中,它转到my widget中的textview)。 我想将移动到一个外部java文件中(以避免代码重复),并通过不同的结果处理方式从其他不同的类(如我的小部件和main activity)调

  • 我有两个表TABLE_A,列名为COLUMN1 COLUMN2 COLUMN3 COLUMN 4 COLUM5 abc def ghi jkl mno 123 456 789 001 121 TABLE_B列名为COLUMN6 COLUMN7,其数据为 专栏5 124 第4列bca 第3列aaa 列5 BBB 所以我将Table_A的列名作为Table_B中的数据 所以我想在一个查询中做这样的事情