2017-12-11 1 views
0

Ich möchte eine Thread-Schleife, die String jedes Mal ändert. (z. B. d -> dd -> ddd -> dddd ...) Ich erwartete, dass es sowohl die Ansicht aktualisiert, als auch der Thread ausgeführt wird, aber der Bildschirm stoppt bei der ersten Ausführung von run() (was "dd" ist). Was ist falsch? Vielen Dank!Android - einfache Thread-Schleife funktioniert nicht

package com.example.name.app; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Button button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       thread t1 = new thread(); 
       t1.start(); 
      } 
     }); 
    } 

    private class thread extends Thread { 

     TextView textView = (TextView) findViewById(R.id.tv); 

     @Override 
     public synchronized void run() { 

      String text = "d"; 
      while (true) { 
       try { 
        text += "d"; 
        textView.setText(text); 
        sleep(5000); 
       } catch (Exception e) { 
        return; 
       } 
      } 
     } 
    } 

} 
+0

Die UI-Elemente müssen im UI-Thread aktualisiert werden. Entweder benutze den Handler, um zu posten oder 'runOnUiThread', um die' TextView' zu aktualisieren. Verwenden Sie auch den CamelCase for Class-Namen gemäß der Namenskonvention. – Chithra

Antwort

1

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    TextView textView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textView = (TextView) findViewById(R.id.tv); 
     final Button button = (Button) findViewById(R.id.btn); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       thread t1 = new thread(); 
       t1.start(); 
      } 
     }); 
    } 

    private class thread extends Thread { 

     String text = "d"; 

     @Override 
     public synchronized void run() { 

      while (true) { 
       try { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          textView.setText(text); 
         } 
        }); 
        sleep(5000); 
        text += "d"; 
       } catch (Exception e) { 
        return; 
       } 
      } 
     } 
    } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="digitdemo.com.myapplication.MainActivity"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/tv" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Count" 
      app:layout_constraintBottom_toBottomOf="parent" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintTop_toTopOf="parent" /> 

     <Button 
      android:id="@+id/btn" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Press" 
      app:layout_constraintBottom_toBottomOf="parent" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintTop_toTopOf="parent" /> 

    </LinearLayout> 

</android.support.constraint.ConstraintLayout> 

Ausgang:

enter image description here

Hoffe das hilft dir.

+0

Es funktioniert !!!! Vielen Dank: D Ich kann jetzt schlafen gehen !!! –

+0

Ihre Begrüßung @ysd und danke, um als richtige Antwort zu markieren. glücklich, dir zu helfen. weiter codieren. – InsaneCat

1

Alle UI-Elemente werden auf Haupt-Thread behandelt. Um also ein beliebiges UI-Element zu aktualisieren, müssen Sie es vom Hauptthread (UI-Thread) aus tun. Sie können runOnUiThread verwenden, um UI-Thread zu schalten:

TextView textView; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textView = (TextView) findViewById(R.id.tv); 
     final Button button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       thread t1 = new thread(); 
       t1.start(); 
      } 
     }); 
    } 

private class thread extends Thread { 

     @Override 
     public synchronized void run() { 

      String text = "d"; 
      while (true) { 
       try { 
        text += "d"; 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          textView.setText(text); 
         } 
        }); 

        sleep(5000); 
       } catch (Exception e) { 
        return; 
       } 
      } 
     } 
} 
0

Anstatt die Thread-Klasse für einfache Aufgabe erstreckt Erhöhen und UI Verwendung handler.Handler in dem gleichen Haupt-Thread mit unterschiedlicher Ausführungsumgebung läuft aktualisieren.

Erstellen Sie einen einfachen Handler und Update Main Thread, wenn Sie möchten.

TextView textView = (TextView) findViewById(R.id.tv); 
String text = "d"; 

Runnable runnable=null; 
Handler newHandler=null; 

private void runTask() { 
    newHandler = new Handler(); 
    runnable = new Runnable() { 
     @Override 
     public void run() { 
      try { 
       //update UI 
       text += "d"; 
       textView.setText(text); 
       newHandler.post(runnable); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    newHandler.post(runnable); 
    } 
} 

und der Handler

newHandler.removeCallbacks(runnable); 
1

Versuchen verwenden zu stoppen this..it gleiche Leistung geben wird, wie Sie wollen.

public class TestActivity extends AppCompatActivity { 
    TextView textView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 
     textView = (TextView) findViewById(R.id.tv); 
     final Button button = findViewById(R.id.btn); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       thread t1 = new thread(); 
       t1.start(); 
      } 
     }); 
    } 

    private class thread extends Thread { 

     String text = "d"; 

     @Override 
     public synchronized void run() { 

      while (true) { 
       try { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          textView.setText(text); 
         } 
        }); 
        sleep(5000); 
        text += "d"; 
       } catch (Exception e) { 
        return; 
       } 
      } 
     } 
    } 
Verwandte Themen