sharedpreference无法读取按钮状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sharedpreference无法读取按钮状态相关的知识,希望对你有一定的参考价值。

我需要在应用kill的时候保存按钮状态,通过sharedpreference。 在/data/data/myapp/shared_prefs这里可以看见按钮值true/false已经被写入了。但是在应用kill的时候读取状态出现问题。 按钮每次重启都会进入默认状态true,我在一个fragment中运行的,因此我用了: final SharedPreferences preferences = this.getActivity().getSharedPreferences("tg1pref",0); 代码如下: boolean on; public SharedPreferences preferences; final ToggleButton toggleButton1 = (ToggleButton) v.findViewById(R.id.toggleButton1); final SharedPreferences preferences = this.getActivity().getSharedPreferences("tg1pref",0); boolean tg1pref = preferences.getBoolean("tg1pref", true); if (tg1pref = true) toggleButton1.setChecked(true); else toggleButton1.setChecked(false); toggleButton1.setOnClickListener(new View.OnClickListener() @Override public void onClick(View v) if((toggleButton1.isChecked())) SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean("tg1pref", true); // value to store editor.commit(); else SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean("tg1pref", false); // value to store editor.commit(); );

参考技术A this.getActivity()会可能返回null,所以你不能这样做。
你需要放在onAttach(Activity
activity)里面进行preferences的初始化。

QNetworkReply 正在读取数据时,QMainWindow 关闭按钮处于非活动状态

【中文标题】QNetworkReply 正在读取数据时,QMainWindow 关闭按钮处于非活动状态【英文标题】:QMainWindow close button gets inactive while QNetworkReply is reading data 【发布时间】:2018-08-13 07:21:55 【问题描述】:

这是我的代码的一些想法。它执行成功。我只是无法在它开始执行读取语句的那一刻使用关闭按钮。!

main() 内部:


int main(int argc, char *argv[])

    QApplication app(argc, argv);
    MainWindow mainWindow;

    mainWindow.show();
    return app.exec();


这是我的构造函数:一个主窗口和一个单击时调用执行的按钮

在 MainWindow.cpp 中:


MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) //this creates a window that has a download button

    setWindowTitle("File Downloader");
    QWidget* central = new QWidget(this); 
    QVBoxLayout *lay = new QVBoxLayout(central);

    button1 = new QPushButton("Download", this);
    connect(button1, SIGNAL (clicked()),this,SLOT( execute()));         
    lay->addWidget(button1);
    manager = new QNetworkAccessManager(this);

这个函数与php文件建立连接,然后调用sendFinished

void MainWindow::execute()   //PHP file link here

 QUrl url"/patofmyphp");
 reply = manager->post(request, data); //data is some string
 connect(reply, SIGNAL (finished()),this,SLOT( sendFinished()));


这个函数从php文件中分块读取数据

void MainWindow::sendFinished()  //this gets called successfully

      while(copied < size)    //copied = 0, size = 10000; 
      
          const QByteArray data = reply->read(tocopy);
          file.write(data);
          copied += data.size();
      

整个程序运行成功。但是当我想在程序成功执行之前使用 QMainWindow 的关闭按钮中止我的回复时。但是当它reply-&gt;read 被执行时,关闭按钮似乎停止工作。我该怎么办?

【问题讨论】:

请编辑您的问题以显示相关代码。最好是minimal reproducible example。 听起来你可能用 while 循环阻塞了事件循环。没有看到你的代码很难说。 如果您需要帮助,您必须提供 minimal reproducible example @thuga 所说的,+ 作为第一个解决方法,您可能希望通过事件循环通过 QTimer::singleShot(0, ...) 调用您的 read() 调用,这样至少您不会阻塞 UI。 那么我需要将 QTimer.. 放在 while 循环中的什么位置? 【参考方案1】:

看起来我只是通过在我的 while 循环中使用这一行来解决我的问题。

QApplication::processEvents(); if(close == true)  closeProgram(); 

【讨论】:

以上是关于sharedpreference无法读取按钮状态的主要内容,如果未能解决你的问题,请参考以下文章

用SharedPreference或文件的方式存储数据

使用 SharedPreferences 保存字符串

Android持久化技术

Android持久化技术

保存整数的 sharedPreferences [重复]

跨进程共享状态变量