2014-02-09 53 views
1

我有这样的活动代码:不能使用全局变量在我的应用程序

public class TopJokes extends Activity { 

    public class Globals extends Application{ 
      String[] myStringArray = {"a","b","c","a","b","c","a","b","c","a","b","c","a","b","c","a","b","c"}; 

     public String[] getMyStringArray() { 
      return myStringArray; 
     } 

     public void setMyStringArray(String[] myStringArray) { 
      this.myStringArray = myStringArray; 
     } 


     } 

    String[] myStringArray = {"a","b","c","a","b","c","a","b","c","a","b","c","a","b","c","a","b","c"}; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_top_jokes);     

     Globals globals = (Globals)getApplication(); 

     new loadJson().execute(); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, globals.getMyStringArray()); 

     ListView listView = (ListView) findViewById(R.id.topJokesList); 
     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // When clicked, show a toast with the TextView text 
       Toast.makeText(getApplicationContext(), 
       ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    }  

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.top_jokes, menu); 
     return true; 
    } 

    public class loadJson extends AsyncTask<Void, Integer, String>{ 

     @Override 
     protected String doInBackground(Void... params) { 
      URL u; 
      StringBuffer buffer = new StringBuffer(); 
      try { 
      u = new URL("https://site.com/android/britishJokes/showJokes.php"); 
      URLConnection conn = u.openConnection(); 
      BufferedReader in = new BufferedReader(
            new InputStreamReader(
             conn.getInputStream())); 

      String inputLine; 
      while ((inputLine = in.readLine()) != null) 
       buffer.append(inputLine); 
      in.close(); 

      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      return buffer.toString(); 
     } 

     protected void onPostExecute(String buffer) { 
      JSONArray jsonArray = new JSONArray(); 
      try { 
       jsonArray = new JSONArray(buffer); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("JSONarray: " + jsonArray); 
      String[] newJokes = null; 
      for (int i = 0; i < jsonArray.length(); i++) { 
       try { 

       newJokes[i] = jsonArray.getJSONObject(i).toString(); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      myStringArray = newJokes; 
     } 

    } 
} 

我已经创建的类Globals - 应该保持全局​​变量。

这里是我如何在清单中声明它:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.gs.britishjokes" 
    android:versionCode="1" 
    android:versionName="1.0" 
    android:name=".Globals"> 

的问题是,当我尝试访问全局变量myStringArray在这行: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, globals.getMyStringArray());我得到吨的错误和我的不明白什么是错的。

我很确定我错过了一些非常小的东西,但作为一个初学者,我无法发现它。

这里是日志:

02-09 12:00:22.627: E/AndroidRuntime(3249): FATAL EXCEPTION: main 
02-09 12:00:22.627: E/AndroidRuntime(3249): Process: com.gs.britishjokes, PID: 3249 
02-09 12:00:22.627: E/AndroidRuntime(3249): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gs.britishjokes/com.gs.britishjokes.TopJokes}: java.lang.ClassCastException: android.app.Application cannot be cast to com.gs.britishjokes.TopJokes$Globals 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.ActivityThread.access$700(ActivityThread.java:135) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.os.Handler.dispatchMessage(Handler.java:102) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.os.Looper.loop(Looper.java:137) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.ActivityThread.main(ActivityThread.java:4998) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at java.lang.reflect.Method.invoke(Method.java:515) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at dalvik.system.NativeStart.main(Native Method) 
02-09 12:00:22.627: E/AndroidRuntime(3249): Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to com.gs.britishjokes.TopJokes$Globals 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at com.gs.britishjokes.TopJokes.onCreate(TopJokes.java:76) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.Activity.performCreate(Activity.java:5243) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 
02-09 12:00:22.627: E/AndroidRuntime(3249):  ... 11 more 

请给我一个线索。我迷路了!

+0

让这个类扩展'Application'。 – nKn

+1

和'Globals'类应该是一个静态类里面的活动或写它作为单独的java文件... –

+0

@GopalRao我只是把它'静态'我;米仍然得到相同的错误:( – chility

回答

1

你应该让你的Globals类静态类内部Activity,或者在一个单独的Java文件(推荐)和写在清单与完全合格的类名称声明它下application标签..

<application 
    android:name="com.packagename.app.TopJokes$Globals" 
    ... /> 
1

在AndroidManifest.xml后,请将您的application到您的应用程序类的名字的名字:

我也建议把Globals到自己的类,而不是在内部类的一些活动。

... 
<application 
    android:name="Globals"/> 
... 
相关问题