我试图在活动中使用警报对话框和异步任务,并收到以下错误
引起:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
码:
public class loginTask extends AsyncTask<Void, Void, Void> {
public ProgressDialog loginDialog = new ProgressDialog(
LoginActivity.this);
@Override
protected void onPreExecute() {
loginDialog.setMessage("Please wait Logging in");
loginDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
if(loginUser()) {
loginDialog.dismiss();
alertbox("title", "winnn", "Okay");
} else {
loginDialog.dismiss();
alertbox("title", "message", "Okay");
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
loginDialog.dismiss();
Intent intentHome = new Intent(LoginActivity.this,
HomeActivity.class);
startActivity(intentHome);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用异步请求从URL中获取图像,以防止URL挂起.这是我正在使用的代码片段
private void setImg(final ImageView im, String url){
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new AsyncHttpResponseHandler(){
public void onSuccess(String response){
try{
byte[] imageAsBytes = response.getBytes();
im.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length));
im.refreshDrawableState();
} catch(Throwable e){
e.printStackTrace();
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
这总是在logcat中显示此警告
12-29 01:55:33.043: D/skia(14414): --- SkImageDecoder::Factory returned null
我找不到合适的理由.有帮助吗?
我正在尝试编写一个测试应用程序来压缩和解压缩文件.我找到了一个用于进行文件压缩/解压缩的开源库,但是你可以猜测这确实需要一段时间,因此我无法在主ui中运行它所以我以为我会使用AsyncTask在后台线程上进行繁重的工作,然后只是呕吐开始,一个完成的消息,一切都会没事的.但我在这里遇到两个大问题.当我点击按钮时,它确实会解压缩文件,但它似乎是在主ui而不是在后台线程中执行它,因为应用程序将锁定并且我确实得到了anr屏幕,而且我正在注意任何新的线程确实使用ddms视图出现,我没有看到任何.如果我告诉它我想等待它将解压缩文件.但是我当然不希望程序出现冻结或者对我不利另一个问题是我已将它设置为在点击后立即更新按钮文本,然后在aysc任务完成时再次更新但是我不知道看看是否发生了变化,我确实改变了文本,以便它们在所有不同的地方,所以我可以告诉.它也应该在状态消息中设置一个文本字段.我认为onPostExecute永远不会被调用.谁能告诉我这里发生了什么?
package net.pawworks.sandbox.svc;
import java.io.File;
import net.pawworks.utils.mainlib.filetools;
import net.pawworks.utils.mainlib.zipper;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class TestserviceActivity extends Activity {
/** Called when the activity is first created. */
String readpath= filetools.sdcardpath()+"/ziptestin/";
TextView readstatus;
Button readbut;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ziptest);
File setup = new File(filetools.sdcardpath()+"/ziptestout");
setup.mkdir();
setup = new File(filetools.sdcardpath()+"/ziptestin/");
setup.mkdir();
readstatus = (TextView)findViewById(R.id.readstatus);
readbut = (Button)findViewById(R.id.readit);
readbut.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
readbut.setText("Loading.....");
String …
Run Code Online (Sandbox Code Playgroud) user-interface multithreading android android-asynctask android-anr-dialog
如何在android中的异步类中显示FTP下载中的进度条?
我尝试了很多东西,但没有得到进度条.这是我的代码,我从其他Activity调用此类将该活动的上下文传递给此类.
package com.scft;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferListener;
import java.io.File;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.StrictMode;
import android.util.Log;
import android.widget.PopupWindow;
import android.widget.Toast;
public class ftpdownload_class {
static final String FTP_HOST= "**************";
/********* FTP USERNAME ***********/
static final String FTP_USER = "*********";
/********* FTP PASSWORD ***********/
static final String FTP_PASS ="*******";
File fileDownload=null;
long startTime_ftpDownload=0;
long endTime_ftpDownload=0;
long downloaded_file=0;
long startTime_ftpUpload=0;
long endTime_ftpUpload=0;
FTPClient client=null;
public static File m_fileName;
private PopupWindow pwindo;
String totaltime_ftpUpload,filesize_ftpUpload,ratevalue_ftpUpload,totaltime_ftpDownload,filesize_ftpDownload,ratevalue_ftp_download;
Context mContext=null;
public ftpdownload_class( Context …
Run Code Online (Sandbox Code Playgroud) In IOS we use blocks when we want to handle an action when a particular situation occur
.
在android中有没有这样的方法来处理onCompletion的情况,我们可以添加它在哪里.
与AsyncTask方法一样,它知道工作何时完成.它执行onPostExecute.当特定情况到达时我们如何创建这种类型的方法,我们就像处理它一样.
今天我找到了一种在IOS中表现得像Block的方式
BaseAsyncTask(new Callback(){
onPostResult(string result)
{
// do whatever you want to do with the result got from asynctaks
}
});
Run Code Online (Sandbox Code Playgroud)
它是一个委托,它在达到特定情况时调用..
我是正确的,上面的代码是在我们在IOS中的块中的块.或者在android中有任何其他创建块的方法.
我试图遍历我的表中的一些记录,并为每个记录,使用值作为参数;
这些都可以完美地完成,但我无法让它们都在AsyncTask中工作.我这里有代码.我知道我可能已经离开了,但是如果有人能给我一个关于我的想法如何消失的推动,我真的很感激.
在第一行
private class FetchWebsiteData extends AsyncTask<Void, String, Void> {
Run Code Online (Sandbox Code Playgroud)
我明白了
Class FetchWebsiteData must either be declared abstract or implement abstract method doInBackground(params...) in 'AsynTask'
Run Code Online (Sandbox Code Playgroud)
作为错误消息并以红色下划线.
private class FetchWebsiteData extends AsyncTask<Void, String, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(summary.this);
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
}
protected String doInBackground(String urls3, String result3) {
helper = new TaskDBHelper(summary.this);
SQLiteDatabase sqlDB = helper.getReadableDatabase();
Cursor dataCount = sqlDB.rawQuery("select TASK from " + TaskContract.TABLE, null);
ArrayList<String> temp = new …
Run Code Online (Sandbox Code Playgroud) 我上周才处理过SQLite数据库.我很久以前曾经处理过SQL,但我仍然有它的要点.
下面的代码从asset
命名中读取140,000个单词dictionary.dic
,并将每个单词与其一起插入SQLite数据库status
.我的期望是它需要很长一段时间,但是在7英寸平板电脑上只需要25分钟,但仍然没有接近完成(在P
).
我应该说,"嘿,这是一百万分之一行.这需要一段时间." 但我可以阅读所有140,000个单词ArrayList<String>
在30秒内.我意识到创建数据库有很多开销,但很多很多分钟?
我应该说,"好吧,想想如果不使用需要多长时间AsyncTask
"并接受它,因为这是一次性的任务?但这真是令人讨厌,花了这么长时间.这是令人不快的.
我应该说,"你为什么要使用Scanner
?难怪它花了这么长时间?" 并做一些其他asset
访问?或者这不是真正的问题吗?
我也没用过AsyncTask
.我在滥用doInBackground
吗?我在那里有很多代码; 并非所有人都必须去那里,但循环就是这样,而且还有挂断.
使用database.Insert
,这被称为"便利方法",是什么导致挂断?我应该使用Cursor
和吗?query
不是吗?我不完全确定我是怎么做到的.从Deitel的"地址簿"应用程序"Android for Programmers - App Driven ..."中得到了我的想法,但他的数据库一开始就是空的.
我已经充分考虑了这个问题.我只需要有经验的人来看看并说:"好吧,这就是你的问题." 我无法证明在没有任何关于是否有任何帮助的指导下重新开始重做我想到的所有事情.
public class DatabaseConnector //extends ArrayList<String>
{
public static Cursor cursor ;
Scanner scDict;
InputStream stream = null;
Context mContext;
AssetManager mAssets;
public static final String DATABASE_NAME = "Dictionary";
public static final String TABLE_NAME = "wordlist";
public …
Run Code Online (Sandbox Code Playgroud) 我已经创建了一个类并使用AsyncTask进行了扩展,现在我想向我返回一个字符串以将另一个类抛出该活动。它从mysql mDatabase获取jsonstring
enter code here
public class GetJson extends AsyncTask<Void,Void,String> {
String JSON_STRING;
String json_url;
public String pasString;
Activity ab;
@Override
protected void onPreExecute() {
json_url="https://XXXXXXX.000webhostapp.com/Json_getData_Survey.php";
}
public GetJson(Activity b) {
ab=b;
}
@Override
protected String doInBackground(Void... params) {
try {
URL url =new URL(json_url);
HttpURLConnection httpURLConnection =(HttpURLConnection) url.openConnection();
InputStream inputStream =httpURLConnection.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder=new StringBuilder();
while ((JSON_STRING=bufferedReader.readLine())!=null)
{
stringBuilder.append(JSON_STRING+"\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
String strings =stringBuilder.toString().trim();
return strings;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch …
Run Code Online (Sandbox Code Playgroud) 我通过异步请求获取数据.我知道在显示数据之前我需要等待api请求完成.不幸的是,我不确定如何创建一个加载器来等待数据加载.我是新的反应,所以如果我也可以得到实现它的帮助,那将是太棒了!这是我目前的代码:
import React, { Component, PropTypes } from 'react';
import { View, Text, ListView, StyleSheet, TouchableHighlight} from 'react- native';
import Header from '../Components/Header';
import Api from '../Utility/Api';
export default class CalendarPage extends Component {
constructor(props) {
super(props);
}
async componentWillMount() { this.setState(
{data: await Api.getDates()},
)
}
render() {
return (
<View style={{flex: 1}}>
<Header pageName="Calendar" navigator={this.props.navigator}/>
<View style = {{flex:9}}>
<View>
{ this.state.data.days[0].items.map((item) => (
<View>
<Text>{item.summary}</Text>
<Text>{item.start.dateTime}</Text>
<Text>{item.description}</Text>
</View>
))}
</View>
</View>
</View>
);
}
Run Code Online (Sandbox Code Playgroud)
}
我发出POST请求以保护服务器,这需要相当长的时间.我想让它更快.有机会这样做吗?它看起来像这样:
private class GetTokenTask extends AsyncTask<Void, Void, String> {
private final String LOG_TAG = MainActivity.class.getSimpleName();
private Call mCallToServer;
private String mAccessToken;
private OkHttpClient mHttpClient;
private JSONObject mResponseJSON;
private Response mResponseFromServer;
@Override
protected String doInBackground(Void... params) {
mHttpClient = new OkHttpClient();
mCallToServer = mHttpClient.newCall(requestToOAuth());
try {
mResponseFromServer = mCallToServer.execute();
mResponseJSON = new JSONObject(mResponseFromServer.body().string());
mAccessToken = mResponseJSON.getString(getString(R.string.access_token_key));
Log.i(LOG_TAG, mAccessToken);
Log.i(LOG_TAG, JWTUtils.decoded(mAccessToken));
} catch (Exception e) {
e.printStackTrace();
}
return mAccessToken;
}
@Override
protected void onPostExecute(String token) {
super.onPostExecute(token);
}
} …
Run Code Online (Sandbox Code Playgroud)