为什么我的应用程序会挂起线程,如何修复?

4

这是我的代码:

public class CustomSwipeAdaptor extends PagerAdapter {

    private int[] image_resources={R.drawable.aa,R.drawable.bb,R.drawable.cc};
    private Context ctx;
    private LayoutInflater layoutInflater;

    public CustomSwipeAdaptor(Context ctx)
    {
        this.ctx=ctx;
    }

    @Override
    public int getCount() {
        return image_resources.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return (view==(LinearLayout)object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        layoutInflater=(LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE );
        View item_view=layoutInflater.inflate(R.layout.swipe_layout,container,false);
        ImageView imageView=(ImageView)item_view.findViewById(R.id.image_view);
        imageView.setImageResource(image_resources[position]);
        container.addView(item_view);
        return item_view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((LinearLayout)object);
    }
}


public class Chapter1 extends AppCompatActivity{

    ViewPager viewPager;
    CustomSwipeAdaptor adaptor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chapter1);
        viewPager=(ViewPager)findViewById(R.id.view_pager);
        adaptor=new CustomSwipeAdaptor(this);
        viewPager.setAdapter(adaptor);
    }


}

这是我的日志记录:

06-12 18:45:05.631 341-349/com.example.kips.itapps W/art: Suspending all threads took: 7.170ms 
06-12 18:45:27.677 341-349/com.example.kips.itapps W/art: Suspending all threads took: 6.168ms 
06-12 18:47:31.577 341-349/com.example.kips.itapps W/art: Suspending all threads took: 7.052ms 
06-12 18:48:36.275 341-349/com.example.kips.itapps W/art: Suspending all threads took: 5.650ms 
06-12 18:56:21.208 341-349/com.example.kips.itapps W/art: Suspending all threads took: 8.523ms

1
你认为这些警告代表需要解决的问题吗? - CommonsWare
如果您删除imageView.setImageResource(image_resources[position]);这行代码,警告会消失吗? - Giorgio Antonioli
@CommonsWare:至少在我的代码中,它们似乎与所有线程在超过1000毫秒的时间内没有完成工作相关,即使每个logcat行都只暂停了9毫秒。 - Mooing Duck
1个回答

1

这基本上是无害的。从这里开始

Java代码的堆是一个共享资源。对于ART中的GC暂停,必须暂停线程,以便它们不会更改堆并破坏GC不变量。为了暂停线程,GC修改了线程本地变量,然后线程观察到此更改并放弃mutator锁,GC将独占锁并运行。当其他线程放弃mutator锁的份额时,由于线程被暂停,因此对于jank来说,线程及时响应非常重要。 5ms几乎相当于16ms帧的1/3,因此ART在线程暂停缓慢时发出警告。正如+Aladin Q所说,这可能会发生很多负载。如果频繁发生或没有负载,则可能是可能导致jank的错误的证据。

除非您的应用程序存在严重问题,阻止其实现目标,否则它是良性的,以及其他类似的日志输出


2
要点:挂起线程不是警告的重点。重点是它很慢。 - chrylis -cautiouslyoptimistic-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接