线程停止响应

时间:2015-11-16 16:54:39

标签: android multithreading

我是新的Android开发者。我没有参加任何课程,但我正在使用互联网学习。 请在你的机器人中复制粘贴相同,尝试并指导我为什么它不起作用?

它是在eclipse中开发的。外部依赖项是httpclient-4.0.jar和httpcore-4.0.1.jar 我开发了一个应用程序。 它从IIS服务器获取报告列表。这实际上是HTML Pages的链接。 (这是全球性的,您可以查看链接)

IT共有16个Html页面。 应用程序假设每10秒更改一次WebView中的Report(Html Page)。它改变报告一次。但后来它没有改变。

请检查并告诉我什么是错误。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.CorpoServe.bvgindialtd.ReportViewer" >

<Button
    android:id="@+id/btnPrev"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="30dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:text="@string/prev" />

<Button
    android:id="@+id/btnNext"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="30dp"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="@string/next" />

<WebView
    android:id="@+id/Brz"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_alignLeft="@+id/btnPrev"
    android:layout_below="@+id/btnPrev" />

<ToggleButton
    android:id="@+id/tbX"
    android:layout_width="wrap_content"
    android:layout_height="30dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:checked="true"
    android:text="@string/play"
    android:textOff="Pause"
    android:textOn="Play" />
</RelativeLayout>

这是我的班级

     package com.CorpoServe.bvgindialtd;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;
import android.widget.ToggleButton;

public class ReportViewer extends ActionBarActivity {

List<String> ls= new ArrayList<String>();
int counter=0;
Handler hnd;
ToggleButton tb;
WebView bz;
public String GetIntenetData(String URL) throws Exception{
    BufferedReader in=null;
    String data=null;
    //URL="http://corposerve.com/ActionPage.asp?action=auth&uid=abc&pwd=abc";
    try{
        HttpClient cl= new DefaultHttpClient();
        URI ws= new URI(URL);
        HttpGet rq=new HttpGet();
        rq.setURI(ws);
        HttpResponse rs = cl.execute(rq);
        in= new BufferedReader(new InputStreamReader(rs.getEntity().getContent()));
        StringBuffer sb=new StringBuffer("");
        String l ="";
        String nl= System.getProperty("line.separator");
        while((l=in.readLine())!=null){

        sb.append(l+nl);

        }
        in.close();
        data=sb.toString();
        return data;
    } finally {
        if(in!=null){
            try{
                in.close();
                return data;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

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

     if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

     try {
        String Url="http://203.90.76.206/newmis/GetReportList.aspx";
        String ss[]=GetIntenetData(Url).split(System.getProperty("line.separator"));
        ls.clear();
        for(String s:ss){
            String[] x =s.split(Pattern.quote("*"));
            ls.add("http://203.90.76.206/newmis" + x[0]);

        }
        bz= (WebView) findViewById(R.id.Brz);
        bz.getSettings().setBuiltInZoomControls(true);
        bz.getSettings().setSupportZoom(true);
        bz.getSettings().setUseWideViewPort(true);
        bz.getSettings().setLoadWithOverviewMode(true);
        bz.loadUrl(ls.get(0));
        tb=(ToggleButton)findViewById(R.id.tbX);
        counter=0;

        hnd=new Handler();
        Runnable rnbl=new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

                    try {
                        Thread.sleep(10000);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    hnd.post(new Runnable(){

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            if (tb.isChecked()){
                            counter++;
                            if (counter>=ls.size()-1){
                                counter=0;
                            }

                            bz.loadUrl(ls.get(counter));
                        }
                        }
                    });

            }
        };

        new Thread(rnbl).start();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        Toast t= new Toast(getApplicationContext());
        t.setText( "1:" + e.getMessage());
        t.show();
    }

     final Button nxt= (Button)findViewById(R.id.btnNext);
     final Button prv=(Button)findViewById(R.id.btnPrev);
     nxt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            counter++;
            if(counter>=ls.size()){counter=0;}
            bz.loadUrl(ls.get(counter));

        }
    });
     prv.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            counter--;
            if (counter<0){counter=ls.size()-1;}
            bz.loadUrl(ls.get(counter));
        }
    });
     tb.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(tb.isChecked()){nxt.setEnabled(false);prv.setEnabled(false);}else{nxt.setEnabled(true);prv.setEnabled(true);}

        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.report_viewer, menu);
    //MenuItem itm=menu.findItem(R.menu.report_viewer);
    //itm.setVisible(false);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

1 个答案:

答案 0 :(得分:0)

我必须承认我还没有尝试过您的代码,但是您已经有很多事情需要处理。首先,您不应该在您的活动GetIntenetData()中调用onCreate() [原文]方法。这会阻止你的UI线程,它不应该。

以下是初学者的一些有用资源:

基本上,您应该在onCreate()初始化您的活动和视图组件,然后您可以从AsyncTask启动onResume()以在后台加载您的内容。

最后,通过快速阅读您的代码,您似乎只调用了Runnable一次,这可以解释为什么您只加载一页。