2016-08-04 60 views
0

Ich benutze Handler, um einige UI-Eigenschaften zu ändern, aber ich sehe keine Änderungen, wenn die App ausgeführt wird. Warum kompiliert sich der Code nicht? Ich habe Handler in meinem Thread verwendet, um die Schaltflächen und Bilder der Benutzeroberfläche zu ändern. Ich verstehe für Bilder ich könnte leicht Bitmaps verwenden, um effizienter zu sein, aber ich benutze dies um Code mit Threads zu lernen, um die App-Leistung zu verbessern.Verwenden von Threads zum Ändern der UI-Eigenschaften in einem Fragment?

Fragmentcode;

Hauptaktivitätscode, wo ich OnCreate() natürlich aufrufen und die ersten Fragmente anzeigen, die mit der Aktivität erstellt werden;

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.view.View; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.app.FragmentManager; 
import android.widget.FrameLayout; 
import android.widget.Button; 



public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 




    Button button; 
    headercode header; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 



     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 



     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     if (findViewById(R.id.fragment) != null){ 

      header = new headercode(); 
      getSupportFragmentManager().beginTransaction().add(R.id.fragment,header).commit(); 
     } 

    } 

Antwort

0
Runnable r = new Runnable() 
{ 
    @Override 
    public void run(){ 
     handler.sendEmptyMessage(0); 
    } 
}; 

hier definieren Sie nur ein Runnable, aber du hast es nicht zu Handler schreiben. so sollten Sie eine Zeile nach dem Runnable defination hinzufügen:

handler.post(r); 

Und in der Tat, Sie viele Fehler im Code gemacht:

, wenn Sie verwenden Runnable, nicht wahr brauchen ovrride handleMessage, sie sind tun gleiche Arbeit, so dass Sie nur Runnable oder einfach nur handleMessage verwenden, wie folgt vor:

// Just use Runnable 
@Override 
public View onCreateView(...) { 
    //... 
    new Handler().post(new Runnable() { 
     @Override 
     public void run() { 
      image = (ImageView)myView.findViewById(R.id.image); 
      image.setBackgroundResource(R.drawable.ahmed); 
     } 
    }) 
    //... 
} 


//------------------------------------------------- 
// Or just use handleMessage 
Handler handler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     image = (ImageView)myView.findViewById(R.id.image); 
     image.setBackgroundResource(R.drawable.ahmed); 
    } 
}; 

@Override 
public View onCreateView(...) { 
    //... 
    handler.sendEmptyMessage(0); 
    //... 
} 

und hier in der Tat, haben Sie keine Unter Threads verwenden, werden alle Invokes sind in Haupt-Thread. Verwenden Sie ein Runnable oder Handler bedeutet nicht, dass in Unter-Thread ausgeführt wird.