2017-12-08 17 views
0

スーパークラスにあるコードIntent intent=new Intent(context,Activity.class)は、サブクラスが異なるコンテキストを持ち、クリックリスナーで起動するさまざまなアクティビティが呼び出されるため、サブクラスによって再利用できます。出来ますか?サブクラスのコードを再利用する方法Intent intent = new Intent(context、Activity.class)スーパークラスからサブクラスに?

public class CommonPost extends AppCompatActivity { 

    public void on_create(final Context context, final Class aclass) { 
     post.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       CommonPost commonPost = new CommonPost(); 
       MyTask task = commonPost.new MyTask(context, aclass); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
       else 
        task.execute(); 
      } 
     }); 
    } 


class MyTask extends AsyncTask<Void,Void,Void> { 
      Context context; 
      Class aclass; 

     public MyTask(Context context,Class aclass){ 
      this.context=context; 
      this.aclass=aclass; 
     } 

     @Override 
     protected void onPreExecute() { 
      // do something 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      // do something 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      Intent intent = new Intent(context, aclass); 
      startActivity(intent); 
     } 
} 

ワン:

public class PlacementPost extends CommonPost { 
      Context context=PlacementPost.this; 
      Class aclass=Placements.class; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       on_create(context,aclass); 
      } 
     } 

私は上記のコードしようとすると、私は次のエラーを取得しています:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference 
     at android.app.Activity.startActivityForResult(Activity.java:4266) 
     at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 



at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 
    at android.app.Activity.startActivityForResult(Activity.java:4224) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
    at android.app.Activity.startActivity(Activity.java:4548) 
    at android.app.Activity.startActivity(Activity.java:4516) 
    at studentapp.notefi.CommonPost$PlaceTask.onPostExecute(CommonPost.java:240) 
    at studentapp.notefi.CommonPost$PlaceTask.onPostExecute(CommonPost.java:177) 
    at android.os.AsyncTask.finish(AsyncTask.java:660) 
    at android.os.AsyncTask.-wrap1(AsyncTask.java) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

この は、スーパークラスであります

私はどこが間違っているのか、何が足りないのか分かりません。論理的に正しいと感じたものを試しました。私が間違っている場所を修正してください!新しい使用して、あなたの活動を初期化するべきではありません初心者のため

+1

[の可能性のある重複NullPointerExceptionがあり、そしてどのように何私はそれを修正しますか?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

あなたの 'MyTask'初期化コードのポスト –

+0

@rajanks上記のコードを編集しました。 –

答えて

1

、それはそれは自身のライフサイクルとコンテキストは、あなたが実際に意図を開始しているクラスである

on_create

にあなたのコードを変更する必要がありますしています
public void on_create(final Context context, final Class aclass) { 
      post.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        MyTask task = new MyTask(stor_root, mProgress, editTextplace, post, ninfo, imageUri, 
          mstorage, mDatabase, context, aclass); 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
         task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
        else 
         task.execute(); 
       } 
      }); 
     } 

MyTaskにが - 子供からcontextを渡す停止

class MyTask extends AsyncTask<Void,Void,Void> { 
     Class aclass; 

     public MyTask(Class aclass){ 
      this.aclass=aclass; 
     } 

     @Override 
     protected void onPreExecute() { 
      // do something 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      // do something 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      Intent intent = new Intent(CommonPost.this, aclass); 
      startActivity(intent); 
     } 
} 

サブクラスあなたは変数クラススコープない内部クラススコープようにする必要があり

public class PlacementPost extends CommonPost { 
      Context context=PlacementPost.this; 
      Class aclass=Placements.class; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       on_create(aclass); 
      } 
     } 
+0

ありがとうございます..それは動作します! –

+1

基本クラス 'context'で子クラス' context'にもアクセスできるので、親に明示的に送る必要はありません –

0

これは内部クラスのスコープの変数です:

public class CommonPost extends AppCompatActivity { 

    ... 
    class MyTask extends AsyncTask<Void,Void,Void> { 
    Context context; 
    Class aclass; 

    ... 

    } 
} 

あなたは子クラスからContext contextClass aclass;にアクセスすることはできません。

あなたはそれクラススコープにする必要があります。

public class CommonPost extends AppCompatActivity { 

    // set to protected to only allow child class access. 
    protected Context context; 
    protected Class aclass; 

    ... 
    class MyTask extends AsyncTask<Void,Void,Void> { 

    } 
} 

次に、あなたの子クラスで、に変数を変更します。

public class PlacementPost extends CommonPost { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // set the value to the base class. 
    context = PlacementPost.this; 
    aclass = Placements.class; 

    on_create(context,aclass); 
    } 
} 
+0

私はまだ同じエラーが発生しています! –