【问题标题】:Running in the same thread, yet CalledFromWrongThreadexception在同一个线程中运行,但 CalledFromWrongThreadexception
【发布时间】:2015-12-14 22:11:31
【问题描述】:

编译器说 ppp 只能被创建它的线程所触及,尽管它是在上面的一行中创建的。 可能是什么问题?

public void init(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                elet = 10;
                InetAddress addr;
                Socket sock = new Socket("46.101.150.158", 1035);
                addr = sock.getInetAddress();
                DataOutputStream ki = new DataOutputStream(sock.getOutputStream());
                ki.write('a');
                ki.flush();
                final BufferedReader be = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                lekert = String.valueOf(be.readLine());
                Log.d("Szo",lekert);
                kiir = "";
                word = lekert;
                tomb = new Boolean[lekert.length()-1];
                for(int i = 0; i < lekert.length()-1;++i){
                    tomb[i] = false;
                }
                tomb[0] = true;
                tomb[lekert.length()-2] = true;
                for(int i = 0 ; i < lekert.length()-1;++i){
                    if(tomb[i]){
                        kiir += lekert.charAt(i);
                    }else{
                        kiir += '_';
                    }
                }
                TextView ppp = (TextView)findViewById(R.id.textView);
                ppp.setText(kiir);
                Button check = (Button)findViewById(R.id.button);
                if(elet == 0){
                    check.setVisibility(View.INVISIBLE);
                }

【问题讨论】:

  • 如果您能提供一个最小的示例来重现您的错误并且我们可以轻松复制粘贴并运行,那就太好了。
  • 显示它们、错误行和堆栈。毕竟这是如此;)

标签: java android multithreading android-studio


【解决方案1】:

虽然上面已经创建了一行

不,它没有。你打电话给findViewById()findViewById()创建任何东西。它从您现有的视图层次结构中找到一个小部件。该视图层次结构是在其他地方创建的(例如,setContentView() 在您的活动的 onCreate() 方法中)。

要么切换到使用AsyncTask(在onPostExecute() 中使用您的小部件更新代码),要么安排在主应用程序线程上更新您的TextViewButton

【讨论】:

    【解决方案2】:

    如果你想调用 ui 方法,你必须调用runOnUiThread。所以尝试从这里改变它

    TextView ppp = (TextView)findViewById(R.id.textView);
    ppp.setText(kiir);
    Button check = (Button)findViewById(R.id.button);
    if(elet == 0){
        check.setVisibility(View.INVISIBLE);
    }
    

    到这里

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            TextView ppp = (TextView)findViewById(R.id.textView);
            ppp.setText(kiir);
            Button check = (Button)findViewById(R.id.button);
            if(elet == 0){
               check.setVisibility(View.INVISIBLE);
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2019-08-16
      • 2021-12-16
      • 2013-04-12
      • 2021-01-27
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多