【发布时间】:2015-12-17 10:29:08
【问题描述】:
我看到了很多重复的问题(here、here、here 和 here),但我的问题没有得到解决。
这是我的应用程序的想法
从url 获取内容并在每个按钮点击 上使用textview 显示它。
(网址内容会每次刷新都会随机生成不同的文字)
This 是我的应用程序的旧代码,它运行良好,但 StackOverflow 人建议我使用 AsyncTask
我在 doInBackground() 方法中指定了获取 URL 内容操作,并在 onCreate 的 Button Click 事件中调用了 new myAsyncTask.execute()。
它只对第一次点击起作用,然后我的应用程序崩溃了。它说 AsyncTask 应该只调用一次。但我希望我的 TextView 在每个按钮单击事件上更新。
那么,我现在该怎么办
我是否想取消我之前的 AsyncTask 并调用新的(或) 我想为 AsyncTask 初始化新对象并再次调用它(这是最糟糕的方法)
如何使用 AsyncTask 或任何 Alternate 在我的应用中实现我的想法?
这是我的代码:
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.");
}
}
}
在此先感谢...(:
【问题讨论】:
-
每次你想运行它时,只需创建一个新的 AsyncTask 实例。如果你不能让它工作,你必须发布你的代码让我们帮助你。
-
发布您的代码以提供帮助。
-
是的,对不起,我之前忘记粘贴了
-
将
myAsyncTask=new MyAsyncTask();移动到onClick()方法的开头。 -
请忽略
comments和LogCat消息,因为我从各个地方复制代码。