1

このリンクから何かを読んで適用します: AsyncTask は別のクラスであるため、OnPostExecute() の結果をメイン アクティビティに取得する方法は? しかし、行 delegate.processFinish(result); でエラー NullPointerException onPostExecute が発生します。私のコードの問題は何ですか? コードは次のとおりです。

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

5 に答える 5

3

変数を次のように初期化しますnull

public AsyncResponse delegate=null;

NPE使用しようとすると自然に与えられます。Activityあなたのコンストラクターにそれを渡し、AsyncTaskそのオブジェクトに初期化できるように、あなたの値を与えます。

于 2013-10-02T14:20:15.433 に答える
0

そこから新しいオブジェクトを作成するときに asynctask() メソッドにアクセスできます。サンプル:

LoginSyncProvider syncProvider = (LoginSyncProvider) new LoginSyncProvider(){
                                @Override
                                protected void onPostExecute(Void aVoid) {
                                    super.onPostExecute(aVoid);
                                    //TODO write something here
                                    }
                                }
                            }.execute();
于 2015-10-27T13:51:48.063 に答える