Android 在按钮单击中执行AsyncTask,无崩溃或异常

Android 在按钮单击中执行AsyncTask,无崩溃或异常,android,android-asynctask,Android,Android Asynctask,我看到了很多关于这个问题的疑问(、、和),但我并没有找到解决问题的办法 这是我的应用程序的想法 从中提取内容并使用文本视图显示内容在上单击每个按钮 (URL内容将为每次刷新随机生成不同的文本 是我的应用程序的旧代码,它工作得很好,但StackOverflow用户建议我使用AsyncTask 我在doInBackground()方法中指定了获取URL内容操作,并在按钮中调用了new myAsyncTask.execute(),单击onCreate中的事件 它只在第一次点击时起作用,然后我的应用程

我看到了很多关于这个问题的疑问(、、和),但我并没有找到解决问题的办法

这是我的应用程序的想法

从中提取内容并使用文本视图显示内容在上单击每个按钮

(URL内容将为每次刷新随机生成不同的文本


是我的应用程序的旧代码,它工作得很好,但StackOverflow用户建议我使用AsyncTask

我在doInBackground()方法中指定了获取URL内容操作,并在按钮中调用了new myAsyncTask.execute(),单击onCreate中的事件

它只在第一次点击时起作用,然后我的应用程序崩溃了。它说AsyncTask应该只调用一次。但我希望在每个按钮单击事件上更新我的文本视图


那么,我现在该怎么办

是否要取消以前的异步任务并调用新任务(或) 我想为AsyncTask初始化新对象并再次调用它(这是最糟糕的方法)

我如何使用AsyncTask或任何替代方案在应用程序中实现我的想法?

这是我的代码:

public class MainActivity extends AppCompatActivity {

    TextView resultView;String TAG="MainActivity kbt";
    SmoothProgressBar mProgressBar;
    Context context;
    MyAsyncTask myAsyncTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      //  StrictMode.enableDefaults();  //Used to executes URL connection on MainThread without getting Exception
        setContentView(R.layout.activity_main);
        mProgressBar = (SmoothProgressBar) findViewById(R.id.progressBar);
       StrictMode.enableDefaults();
        resultView = (TextView) findViewById(R.id.result);
        myAsyncTask=new MyAsyncTask();
       // mProgressBar.setVisibility(SmoothProgressBar.INVISIBLE);


        Button insert=(Button) findViewById(R.id.button);
        insert.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                myAsyncTask.execute();

            }
        });
    }   

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        String mTAG = "myAsyncTask";

        @Override
        protected void onPreExecute() {
           mProgressBar.progressiveStart();
        }

        @Override
        protected Void doInBackground(Void... arg) {

            try {
                getData();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }


        @Override
        protected void onPostExecute(Void a) {
            mProgressBar.progressiveStop();
        }
    }

 public void getData() throws IOException {

        String result = "";
        InputStream isr = null;  

        URLConnection urlConnection = null;
        URL url = new URL("http://kbtganesh.16mb.com/index.php");
        Log.d(TAG,"After  URL NOT WORKING");   //AFTER THIS.... NEXT LOG (ie GOT URL CONNETION) IS NOT PRINTED

        urlConnection =  url.openConnection();

        Log.d(TAG, "GOT URL CONNETION");

        Log.d(TAG, "GOT URL CONNECTED");
        isr =urlConnection.getInputStream();
        Log.d(TAG,"AFTER ISR EQ");



        //convert response to string

        try {
           // BufferedReader reader = new BufferedReader(new InputStreamReader(isr,"iso-8859-1"),8);
            BufferedReader reader = new BufferedReader(new InputStreamReader(isr));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            isr.close();

            result=sb.toString();
        }
        catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
        }

        //parse json data
        try {
            resultView.setText(result);
        }
        catch(Exception e) {
            Log.e("log_tag", "Couldn't set text, damnit.");
        }

    }

}
public类MainActivity扩展了AppCompatActivity{
text查看结果视图;字符串标记=“main活动kbt”;
SmoothProgressBar-mProgressBar;
语境;
MyAsyncTask MyAsyncTask;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//StrictMode.enableDefaults();//用于在主线程上执行URL连接而不会出现异常
setContentView(R.layout.activity_main);
mProgressBar=(SmoothProgressBar)findViewById(R.id.progressBar);
StrictMode.enableDefaults();
resultView=(TextView)findViewById(R.id.result);
myAsyncTask=新建myAsyncTask();
//设置可见性(SmoothProgressBar.INVISIBLE);
按钮插入=(按钮)findViewById(R.id.Button);
insert.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//TODO自动生成的方法存根
myAsyncTask.execute();
}
});
}   
私有类MyAsyncTask扩展了AsyncTask{
字符串mTAG=“myAsyncTask”;
@凌驾
受保护的void onPreExecute(){
mProgressBar.progressiveStart();
}
@凌驾
受保护的Void doInBackground(Void…arg){
试一试{
getData();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void a){
mProgressBar.progressiveStop();
}
}
public void getData()引发IOException{
字符串结果=”;
InputStream isr=null;
URLConnection URLConnection=null;
URL=新URL(“http://kbtganesh.16mb.com/index.php");
Log.d(标记,“在URL不工作之后”);//在此之后……未打印下一个日志(即获取URL连接)
urlConnection=url.openConnection();
d(标记“GOT-URL-CONNETION”);
Log.d(标记“已连接URL”);
isr=urlConnection.getInputStream();
日志d(标签“在ISR EQ之后”);
//将响应转换为字符串
试一试{
//BufferedReader读取器=新的BufferedReader(新的InputStreamReader(isr,“iso-8859-1”),8);
BufferedReader reader=新的BufferedReader(新的InputStreamReader(isr));
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
isr.close();
结果=sb.toString();
}
捕获(例外e){
Log.e(“Log_标记”,“错误转换结果”+e.toString());
}
//解析json数据
试一试{
resultView.setText(结果);
}
捕获(例外e){
e(“Log_标签”,“无法设置文本,该死的”);
}
}
}

先谢谢你。。。(:

无论何时调用
execute()
,都必须创建AsyncTask类的新实例(对象)。例如
(新的MyAsyncTask()).execute();

在StackOverflow朋友的帮助下,我终于找到了问题的答案

移动
myAsyncTask=new myAsyncTask();
inside
onClick()
方法解决了我的问题。这是多次执行异步任务的最佳方法

AsyncTask实例在执行完毕后最终将被垃圾收集。因此,我们不必担心创建多个实例。它们将被自动垃圾收集

MyAsyncTask myAsyncTask;
insert.setOnClickListener(new View.OnClickListener() {

        @Override 
        public void onClick(View view) {
            // TODO Auto-generated method stub 
            myAsyncTask=new MyAsyncTask();
            // TODO Auto-generated method stub
           myAsyncTask.execute();


        } 
    }); 

不能多次执行同一个AsyncTask实例


您只需在普通函数中使用它,并在onCreate()的开头指定
StrictMode.enableDefaults();
。这样应用程序就不会因为任何异常而崩溃。

我看到了您以前使用
StrictMode.enableDefaults();
。Emmie Capps也这么说

我可以接受应用程序不会崩溃,但出于许多原因,最好使用AsyncTask。您可以轻松实现progressbar,以指示进程在后台进行,等等


只需在您的onClick()中启动实例将是更好的方法。

如果正在运行,则取消以前的任务,然后通过执行以下操作启动新任务

if (myAsyncTask!= null && myAsyncTask.getStatus() == MyAsyncTask.Status.RUNNING) { 
      myAsyncTask.cancel(true);
}
myAsyncTask.execute();

每次运行AsyncTask时,只需创建一个新的AsyncTask实例。如果无法运行该实例,则必须为我们发布代码以帮助您。发布代码以帮助您。是的,很抱歉,我忘记在移动之前粘贴它了
myAsyncTask=ne