2016-04-06 22 views
1
  1. ABC.class最初のアクティビティクラス。
  2. XYZ.classは、AsyncTaskアクティビティクラスです。

私のアプリケーションで10以上の非同期タスクがあるので、私は非同期タスクを別クラスに保ちました。他のアクティビティを呼び出す方法AndroidアクティビティからAsyncTaskクラスを取得するNPEを取得する

私はアクティビティ(ABC.class)から別のアクティビティAsynctaskクラス(XYZ.class)を呼び出しています。

問題:

1.IはABC.classからその非同期タスクを呼び出すことができますが、私はXYZ.classクラス(Azureのローカルデータベースのデータの取得)のOnCreateの内のいくつかのインスタンスの値を保ちました。 Asynctask NPEを取得しています。

2.非同期タスクが他のアクティビティから呼び出しているときに、2.Oncreateメソッドが実行されていません。

3.Inside doinbackgroudがNPEエラーを受け取っています。

これを解決する方法を教えてください、そうでなければ私に他の解決策を提案してください。

EDIT: DBローカルに、そう私は内部のonCreateまま何のインスタンスを必要とするAzureのサーバーからデータをフェッチ私の非同期タスクはIAMで1

th_tbusergroupmappingは私のデータベース名である非同期タスク

AsyncTaskload_UserGroupMappingTableClass myClass = new AsyncTaskload_UserGroupMappingTableClass(getApplicationContext()); 
               myClass.execute(); 

XYZ.classを呼び出すABC.class

/*CLient for Table5 */ 
    private static MobileServiceClient mClient_UserGroupMapping; 

    //ONLINE CLIENT AZURE 
    public static MobileServiceTable<th_tbusergroupmapping> mToDoTable_UserGroupMapping_ServerAzure; 

    //Offline CLient FOr LOCAL Datbase. 

    public static MobileServiceSyncTable<th_tbusergroupmapping> mToDoTable_UserGroupMapping_Local_Database; 


    @Override 
     protected void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      try { 
       // Create the Mobile Service Client instance, using the provided 

       // Mobile Service URL and key 
       mClient_UserGroupMapping = new MobileServiceClient(
         "***********", 
         "**************", 
         this).withFilter(new ProgressFilter()); 


    /*UserGroupMapping*/ 
       // Get the Mobile Service Table instance to use 
       mToDoTable_UserGroupMapping_ServerAzure = mClient_UserGroupMapping.getTable(th_tbusergroupmapping.class); 

       // LOCAL DATABASE TABLE Instance to use 
       mToDoTable_UserGroupMapping_Local_Database= mClient_UserGroupMapping.getSyncTable("th_tbusergroupmapping", th_tbusergroupmapping.class); 


       //Init local storage 
       initLocalStore().get(); 


      } 
      catch (MalformedURLException e) 
      { 

       Log.i("Oncreate", "There was an error creating the Mobile Service. Verify the URL......!"); 

      } catch (Exception e) { 

       Log.i("Oncreate", "Exception Occur......!"); 
      } 

     } 


    public static class AsyncTaskload_UserGroupMappingTableClass extends AsyncTask<Void, String, Void> 
     { 

      private Context context; 
      public AsyncTaskload_UserGroupMappingTableClass(Context context) { 
       this.context = context; 
      } 

      @Override 
      protected void onPreExecute() 
      { 
       super.onPreExecute(); 

      } 
      @Override 
      protected Void doInBackground(Void... params) 
      { 
      } 
    @Override 
      protected void onPostExecute(Void result) 
      { 

       try 
       { 

        Log.i("DONE ", "Data Sync Done Successfully UserGroupMapping 1"); 


       } catch (Exception e) 
       { 
        e.printStackTrace(); 

        Log.i("Exception ", "Post Excecute"); 
       } 
      } 

     } 
+0

必要な値をAsyncTaskのコンストラクタに渡してプライベートフィールドとして保存できます。それはあなたのために働くだろうか? – Vucko

+0

サーバーからデータを取得しているため、値を渡すことはできません。私はOncreate内でモバイルサービスとキーを開始する必要があります。 – Kumar

+0

AsyncTaskの主な欠陥は、アクティビティのライフサイクルが非常に厳しくないことです。それを間違って使うだけでも、慎重に行かなくても、NPEエラーが発生することがよくあります。あなたのケースでは、AsyncTaskインスタンスを別のアクティビティから使用しています。これは、正直言って、かなり面倒です。AsyncTaskオブジェクトをさまざまなアクティビティで使用する必要がある場合は、別のクラスファイルに保存し、必要なデータを探し出し、適切なコンストラクタを設計する必要があります。 –

答えて

1

アクティビティにAsyncTaskを保持しないでください。通常のJavaクラスでそのまま使用し、そのクラスのインスタンス内にデータを保持しようとしないでください。シングルトンクラス、または共有プレビュー、またはsqliteデータベースなどの他の場所に情報を格納します。

関連する問題