如何在活动中重绘?

时间:2013-10-10 09:21:28

标签: android android-layout interface

我有重绘问题。我有接收信息的应用程序(在字符串中),当我想要更新它时,它会改变界面中显示的任何值。但是如果我旋转手机它将改变值。我有更新值的服务,但我不知道如何更改界面。有人知道吗?

public class MainActivity extends Activity {

    PrinterObject printer;
    private IntentFilter filter;
    static Boolean VISUAL_UPDATES_ENABLED = true;
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        filter = new IntentFilter();
        filter.addAction("update");


        printer = new PrinterObject("134.188.204.155");
        printer.updateAllData();


        //Set the name of the printer
        TextView printername = (TextView)findViewById(R.id.printer_name);
        printername.setText(printer.printerName);
        printerName = printer.printerName;


        String[] message = new String[printer.printerStateReasons.size()];
        message = printer.printerStateReasons.toArray(message);

        //Set the printer status:
        TextView printerstatus = (TextView)findViewById(R.id.tvPrinter_status_msg);
        printerstatus.setText(printer.printerState);
        printerStatus = printer.printerState;

...
protected void onResume() {
        super.onResume();
        startService(new Intent(MainActivity.this,
                Service_refresh.class));
        if(reciever == null) {
            reciever = new myBroadcastReceiver();
        }
        registerReceiver(reciever, new IntentFilter("SendMessage"));

    }

public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
      //set the correct intent filters to listen to
        IntentFilter filter = new IntentFilter();
        filter.addAction("update");

        this.registerReceiver(reciever, filter);
        VISUAL_UPDATES_ENABLED = true;
        //start/resume the refresh service
        startService(new Intent(MainActivity.this,
                Service_refresh.class));
    }

在另一个类中,我有Service_refresh来更改值:

...

public class Service_refresh extends Service {

    private static Timer timer = new Timer();

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        startService();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public void startService() {
        timer.scheduleAtFixedRate(new mainTask(), 0, 1000);
    }

    private class mainTask extends TimerTask {
        public void run() {
            ArrayList<String> temp = new ArrayList<String>();
            ArrayList<PrinterObject> printerObjects = new ArrayList<PrinterObject>();
            // create a new printer object with params[0] (which is an ip/web
            // adress)
            // populate the printer variables
            SharedPreferences appSharedPrefs = PreferenceManager
                    .getDefaultSharedPreferences(getApplicationContext());
            // create a gson objecr
            Gson gson = new Gson();
            // retrieve the current printerObjects stored in your
            // sharedpreferences
            String json = appSharedPrefs.getString("MyObject", "");
            // create an arraylist to store the data in.
            ArrayList<PrinterObject> tempArray = new ArrayList<PrinterObject>();
            try {
                // get each printerobject in the json array
                JSONArray array = new JSONArray(json);
                for (int i = 0; i < array.length(); i++) {
                    JSONObject row = array.getJSONObject(i);
                    // convert the json to a printerObject class
                    PrinterObject obj = gson.fromJson(row.toString(),
                            PrinterObject.class);
                    // add the object to the temporary array.
                    tempArray.add(obj);
                }
                // if everything succeeded clear the original array
                // and put the new data in it
                printerObjects.clear();
                printerObjects = tempArray;
            } catch (Exception e) {
                Log.e("TEST_TEST", "TEST_TEST update borken");
            }
            int i = 0;
            for (PrinterObject printert : printerObjects) {
                if (printert.updateAllData()) {
                    temp.add(printert.printerName + " update successfull");
                    printerObjects.set(i, printert);
                }
                // failed
                else {
                    printert = new PrinterObject(printert.printerIpOrWebAddress);
                    if (printert.updateAllData()) {
                        temp.add(printert.printerName
                                + " updated after session refresh");
                        printerObjects.set(i, printert);
                    } else {
                        temp.add(printert.printerName + " failed to update");
                    }
                }
                i++;
            }
            appSharedPrefs = PreferenceManager
                    .getDefaultSharedPreferences(getApplicationContext());
            Editor prefsEditor = appSharedPrefs.edit();
            gson = new Gson();
            json = gson.toJson(printerObjects);
            prefsEditor.putString("MyObject", json);
            prefsEditor.commit();
            Intent ix = new Intent("update").putExtra("update", "update");
            getApplicationContext().sendBroadcast(ix);
        }
    }
}

有人知道如何更改界面吗?

1 个答案:

答案 0 :(得分:0)

要像Android中的Java那样重绘()方法,可以使用“invalidate()”方法。它的结果与repaint()方法相同。