簡體   English   中英

無法在我的應用中使用全局變量

[英]Can't use global variables in my app

我有這個活動代碼:

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

請給我一個線索。 我迷路了!

在您的AndroidManifest.xml中,將application的名稱設置為Application類的名稱:

我還建議將Globals放入自己的類中,而不是放在一些Activity的內部類中。

...
<application
    android:name="Globals"/>
...

您應該將Globals類設為Activity靜態類,或將其寫入單獨的Java文件中(推薦),並在具有完全限定類名的application標記下的清單中聲明。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM