2016-08-04 55 views
0

我想要使用線程,因爲UI線程上有太多的工作。
該應用程序的工作原理,但它仍然很慢。
我試圖創建的片段有什麼問題嗎?如何使用線程?

Java代碼片段

import android.media.Image; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.ViewGroup; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.ImageView; 
import android.widget.TextView; 
import org.w3c.dom.Text; 
import android.view.View; 


public class headercode extends Fragment implements Runnable { 

    ImageView image; 
    TextView text; 
    View myView; 
    Thread thread; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     myView = inflater.inflate(R.layout.frag, container, false); 
     thread = new Thread(); 
     this.run(); 
     return myView; 
    } 

    @Override 
    public void run(){ 
     thread.start(); 
     image = (ImageView)myView.findViewById(R.id.image); 
     image.setBackgroundResource(R.drawable.ahmed); 
    } 


} 

主要活動代碼onCreate()方法;

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(); 
     } 

    } 
+0

你的代碼不是多線程,它只是創建一個(空)線程並運行它。它比簡單地說'Thread t = new Thread(); t.start();'將工作轉移到新線程中! – alzee

+0

我想你是什麼樣的。 thread = new Thread(this); thread.start(); – David

回答

0

因爲你的線程只是空的,試試這個:

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     // Your code here 
    } 
}).start(); 
+0

該類實現了Runnable,你的意思是Thread是空的? –

+0

噢,我的意思是他剛剛創建了一個線程,並在裏面沒有任何代碼運行它,所以沒有任何事情發生。我的英語不太好,我對此很抱歉 –

+0

我知道你的意思。你的英語很好。我指的是具有'this.run();'的行 –

0

沒有對UI線程的工作太多了。該應用程序的作品,但仍然緩慢。

嗯,首先,這是您的問題中線程中唯一的代碼。

@Override 
public void run(){ 
    thread.start(); 
    image = (ImageView)myView.findViewById(R.id.image); 
    image.setBackgroundResource(R.drawable.ahmed); 
} 

但是,你必須做new Thread(this).start();如果您想該代碼從一個線程運行。另一個Thread是空的。

如果您只關心圖像,則應該按照Displaying Bitmaps Effieciently中的一些文檔進行操作。

或者,您可以使用圖像加載庫來爲您工作。 (爲了防止偏見,我會讓搜索取決於你)。

我試圖使用線程

這是偉大的,但是我相信推薦的方法是,一個Handler或者如果需要的話,一個AsyncTask

不幸的是,沒有太多的事情可以繼續根據你的代碼來準確地回答什麼是慢的。