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