2016-04-06 143 views
1
  1. ABC.class第一个活动类。
  2. XYZ.class是AsyncTask活动类。

在我的应用程序中有超过10个异步任务,所以我在分离的类中保持异步任务。如何从Android活动调用另一个活动AsyncTask类获取NPE

我正在从活动(ABC.class)调用另一个活动Asynctask类(XYZ.class)。

问题:

1.I那个叫异步任务从ABC.class但是,我保留了一些实例值内OnCreate中XYZ.class类(获取Azure的本地数据库中的数据) 。 因此Asynctask获得NPE。

2.Oncreate方法未运行,当该异步任务正在调用From Other Activity时。

3.内部doinbackgroud iam获得NPE错误。

帮助我如何解决这个,否则建议我任何其他解决方案。

编辑:1

在我的异步任务荫从Azure的服务器获取数据本地数据库,所以我需要实例我里面保存的onCreate

ABC.class

调用异步任务

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

XYZ.class

th_tbusergroupmapping是我的数据库名称

/*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的主要缺陷是它对Activity的生命周期非常紧密。使用它错误或根本不够小心,甚至只有活动往往导致NPE错误。在你的情况下,你可以从另一个Activity使用AsyncTask实例,说实话,看起来很混乱。如果您需要在各种活动中使用一些AsyncTask对象,那么您需要将它保存在单独的类文件中,找出它需要的数据并为其设计适当的构造函数。 –

回答

1

然后,不要将AsyncTask保留在一个活动中;只要将它保存在一个普通的Java类中,不要试图将数据保存在该类的实例中;将信息存储在其他地方:单例类,共享首选项或sqlite数据库等。

相关问题